سؤال

إذا كان لدي كائن جافا سكريبت, يقول

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

هناك المدمج في أو قبل ممارسة أفضل طريقة للحصول على طول هذا الكائن ؟

هل كانت مفيدة؟

المحلول

أقوى الإجابة (أيأن يلتقط القصد من ما كنت تحاول القيام به بينما تسبب أقل عدد من الأخطاء) سيكون:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myObj);

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


هنا تحديث اعتبارا من عام 2016 ، على نطاق واسع نشر ES5 و بعدها. ل IE9+ وسائر الحديث ES5+ قادر على المتصفحات ، يمكنك استخدام Object.keys() لذلك رمز أعلاه فقط يصبح:

var size = Object.keys(myObj).length;

هذا لا يجب أن يكون بأي تعديل على النموذج منذ Object.keys() الآن بنيت في.

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

رمز نوع تم إضافة اللغة إلى إنشاء معرفات فريدة من نوعها على خصائص الكائن.الفائدة الرئيسية من رمز نوع هو منع من الكتابة.

Object.keys أو Object.getOwnPropertyNames لا رمزية خصائص.العودة لهم تحتاج إلى استخدام Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

نصائح أخرى

إذا كنت تعرف أنك لا داعي للقلق حول hasOwnProperty الشيكات ، يمكنك القيام بذلك ببساطة شديدة:

Object.keys(myArray).length

تحديث:إذا كنت تستخدم Underscore.js (الموصى بها ، انها خفيفة الوزن!), ثم يمكنك أن تفعل فقط

_.size({one : 1, two : 2, three : 3});
=> 3

إذا لم, و أنت لا تريد أن تعبث مع خصائص الكائن لأي سبب من الأسباب, و هي بالفعل باستخدام مسج, المساعد متاح:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

هنا هو أكثر عبر متصفح الحل.

هذا هو أفضل من الجواب المقبول لأنه يستخدم الأصلي الكائن.مفاتيح إذا كان موجودا.وهكذا هو أسرع لجميع المتصفحات الحديثة.

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

أنا لا جافا سكريبت الخبراء ، ولكن يبدو أنه سيكون لديك لتنفيذ حلقات عبر العناصر الاعتماد عليهم منذ كائن لا طول الطريقة:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey:في الإنصاف OP, جافا سكريبت الوثائق في الواقع تشير صراحة إلى استخدام المتغيرات من نوع كائن في هذه الطريقة باسم "صفائف النقابي".

هذا الأسلوب يحصل كل كائن الأسماء الملكية في صفيف ، حتى تتمكن من الحصول على طول الصفيف الذي يساوي وجوه الخاص بك مفاتيح' طول.

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

لا تعبث مع النموذج أو غيرها من التعليمات البرمجية ، يمكنك بناء وتوسيع الخاصة بك وجوه:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

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

بالطبع يمكنك دائما الكتابة الطرق.ولكن حتى إذا كان لديك التعليمات البرمجية ربما تفشل بشكل ملحوظ, مما يجعل من السهل تصحيح.;)

أبسط واحد هو

Object.keys(myObject).length

هنا كيف و لا تنسى للتحقق من أن العقار ليس على سلسلة النموذج:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;

ببساطة استخدام هذا للحصول على length:

Object.keys(myObject).length

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

هنا مختلفة تماما الحل الذي سوف تعمل فقط في المتصفحات الحديثة (IE9+ ، كروم ، فايرفوكس 4+, Opera 11.60+, Safari 5.1+)

انظر jsFiddle

الإعداد الخاص بك النقابي الدرجة

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

الآن يمكنك استخدام هذه التعليمة البرمجية كما يلي...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

استخدام:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)

@palmsey:في الإنصاف OP, جافا سكريبت مستندات في الواقع تشير صراحة إلى استخدام المتغيرات من نوع كائن في هذه الطريقة باسم "صفائف النقابي".

و في الإنصاف @palmsey كان صحيحا تماما ، فهي ليست صفائف النقابي ، هم بالتأكيد من كائنات :) - بعمل مجموعة النقابي.ولكن فيما يتعلق أوسع نقطة أنت بالتأكيد يبدو أن لها الحق في ذلك وفقا هذه المقالة الجميلة وجدت:

جافا سكريبت "صفائف النقابي" تعتبر ضارة

ولكن وفقا لما كل هذا ليس الإجابة المقبولة نفسها الممارسة السيئة ؟

تحديد نموذج الحجم() وظيفة الكائن

إذا أي شيء آخر قد أضيفت إلى الكائن .النموذج ، ثم اقترح رمز سوف تفشل:

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

لا أعتقد أن الجواب ينبغي أن يكون مقبولا لأنه لا يمكن أن يكون موثوق به على أن العمل إذا كان لديك أي رمز آخر يعمل في نفس سياق التنفيذ.أن تفعل ذلك بطريقة ناجعة بالتأكيد سوف تحتاج إلى تحديد حجم الأسلوب في myArray وتحقق نوع من أعضاء كما يمكنك من خلال تكرار لها.

ماذا عن شيء مثل هذا ...

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}

إذا كان لدينا التجزئة

hash = {"أ" :"ب", "ج":"د"};

يمكن أن نحصل على طول باستخدام طول المفاتيح التي هي طول التجزئة:

مفاتيح(التجزئة).طول

إذا كنت تستخدم AngularJS 1.x يمكنك أن تفعل أشياء AngularJS طريق إنشاء عامل تصفية باستخدام رمز من أي من الأمثلة الأخرى مثل التالية:

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

الاستخدام

في وحدة التحكم الخاصة بك:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

أو في طريقة العرض الخاصة بك:

<any ng-expression="object | lengthOfObject"></any>

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

يعمل هذا بالنسبة لي:

var size = Object.keys(myObj).length;

إذا كنت بحاجة إلى النقابي بنية البيانات التي تكشف حجم أفضل استخدام الخريطة بدلا من كائن.

var myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

الاختلاف على بعض ما سبق هو:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

أنها قليلا أكثر أناقة طريقة لدمج hasOwnProp.

إذا كنت لا تهتم حول دعم Internet Explorer 8 أو أقل, يمكنك بسهولة الحصول على عدد من الخصائص في كائن عن طريق تطبيق الخطوات التاليين:

  1. تشغيل إما Object.keys() للحصول على مجموعة الذي يحتوي على أسماء فقط تلك الخصائص التي هي enumerable أو Object.getOwnPropertyNames() إذا كنت تريد أن تشمل أيضا أسماء الخصائص التي هي غير قابلة للتعداد.
  2. الحصول على .length مكان الإقامة هذا الصفيف.

إذا كنت بحاجة إلى القيام بذلك أكثر من مرة ، يمكنك لف هذا المنطق في وظيفة:

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

كيفية استخدام هذه وظيفة معينة:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

انظر أيضا هذا كمان للحصول على العرض.

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. الكائن.القيم(myObject).طول
  2. الكائن.إدخالات(myObject).طول
  3. الكائن.مفاتيح(myObject).طول

هنا هو نسخة مختلفة من جيمس كوغان الجواب.بدلا من تمرير وسيطة فقط نموذج من فئة الكائن و جعل رمز النظيف.

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle سبيل المثال: http://jsfiddle.net/qar4j/1/

يمكنك ببساطة استخدام Object.keys(obj).length على أي كائن على طول.الكائن.مفاتيح بإرجاع صفيف يحتوي كل كائن مفاتيح (خصائص) التي يمكن أن تأتي في متناول اليدين إيجاد طول هذا الكائن باستخدام طول المقابلة مجموعة.يمكنك حتى كتابة وظيفة من أجل هذا.دعونا الحصول على الإبداعية وكتابة طريقة لأنه فضلا عن (جنبا إلى جنب مع أكثر كونفينينت جالبة المنشأة):

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

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()

أبسط طريقة هي مثل هذا

Object.keys(myobject).length

حيث myobject هو كائن ما تريد طول

يمكنك أن تفعل دائما Object.getOwnPropertyNames(myObject).length للحصول على نفس النتيجة [].length من شأنه أن يعطي العادي الصفيف.

وفيما يلي نسخة من جيمس Coglan الجواب في CoffeeScript لأولئك الذين تخلوا مباشرة جافا سكريبت :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

الملكية

Object.defineProperty(Object.prototype, 'length', {
    get: function () {
        var size = 0, key;
        for (key in this)
            if (this.hasOwnProperty(key))
                size++;
        return size;
    }
});

استخدام

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4

يمكن أن نجد طول الكائن باستخدام :

Object.values(myObject).length

قليلا في وقت متأخر إلى اللعبة ، ولكن طريقة لطيفة لتحقيق هذا (IE9+ فقط) هو تحديد سحر لفت على طول المنشأة:

Object.defineProperty(Object.prototype, "length", {
    get: function () {
        return Object.keys(this).length;
    }
});

و يمكنك فقط استخدامه هكذا:

var myObj = { 'key': 'value' };
myObj.length;

من شأنه أن يعطي 1.

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