سؤال

هل هناك طريقة للحصول عليها (من مكان ما) عدد العناصر في كائن JavaScript؟ (أي تعقيد الوقت المستمر).

لا أستطيع العثور على خاصية أو طريقة لاسترداد هذه المعلومات. حتى الآن يمكنني التفكير إلا في القيام بتكرار من خلال المجموعة بأكملها، ولكن هذا هو الوقت الخطي.
من الغريب أن هناك وصول مباشر إلى حجم الكائن، لا تفكر.

تعديل:
أنا أتحدث عن Object كائن (وليس الكائنات بشكل عام):

var obj = new Object ;
هل كانت مفيدة؟

المحلول

على الرغم من أن تطبيقات JS قد تتبع هذه القيمة داخليا، فلا توجد طريقة قياسية للحصول عليها.

في الماضي، يتعرض البديل جافاسلفوست في موزيلا غير قياسي __count__, ، ولكن تمت إزالته بالإصدار 1.8.5.

للحصول على البرمجة النصية عبر المتصفح التي تمسك بها بشكل صريح حول الخصائص والتحقق hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

في حالة عمليات تطبيق Ecmascript 5 القادرة، يمكن أيضا كتابة ذلك باسم (Kudos افي الكتان)

function countProperties(obj) {
    return Object.keys(obj).length;
}

ضع في اعتبارك أنك ستفقد خصائص أيضا (مثل صفيف length).

إذا كنت تستخدم إطارا مثل JQuery، والنموذج الأولي، Mootools، $ Othd-hype-hype، تحقق مما إذا كانت تأتي مع مجموعات API الخاصة بها، والتي قد تكون حلا أفضل لمشكلتك أكثر من استخدام كائنات JS الأصلية.

نصائح أخرى

للقيام بذلك في أي بيئة متوافقة مع ES5

Object.keys(obj).length

(دعم المتصفح من هنا)
(DOC على Object.keys هنا, ، يشمل الطريقة التي يمكنك إضافتها إلى متصفحات غير ECMA5)

إذا أنت بالفعل باستخدام JQuery في Build الخاص بك فقط قم بذلك:

$(yourObject).length

يعمل بشكل جيد بالنسبة لي على الكائنات، وكان لدي بالفعل مسج كعدد.

function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

AFAIK، لا توجد طريقة للقيام بذلك بشكل موثوق، إلا إذا قمت بالتبديل إلى صفيف. التي بصدق، لا يبدو غريبا - يبدو الأمر مستقيما جدا إلى الأمام بالنسبة لي أن المصفوفات قابلة للعد، والأشياء ليست كذلك.

ربما أقرب سيكون لديك شيء مثل هذا

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

ولكن هذا يخلق مشاكل، أو على الأقل أسئلة. يتم احتساب جميع خصائص المستخدم التي تم إنشاؤها، بما في ذلك وظيفة _Length نفسها! وبينما في هذا المثال البسيط، يمكنك تجنب ذلك فقط باستخدام وظيفة عادية، وهذا لا يعني أنه يمكنك إيقاف النصوص الأخرى من القيام بذلك. إذن ماذا تفعل؟ تجاهل خصائص الوظيفة؟

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

في النهاية، أعتقد أنه من المحتمل أن تخلى فكرة جعل الأشياء الخاصة بك عدلا عدها ومعرفة طريقة أخرى للقيام بكل ما تفعله.

مفهوم الرقم / الطول / الأبعاد لا معنى له حقا بالنسبة لكائن، والحاجة إلى أنه يقترح أنك تريد حقا صفيف بالنسبة لي.

تحرير: أشار لي أنك تريد o (1) لهذا. إلى حد علمي لا توجد بهذه الطريقة خائفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top