javascript - مسار - مميزات الجافا سكريبت




كيف نحسب بشكل فعال عدد مفاتيح/خصائص كائن في JavaScript؟ (12)

أحاول جعلها متاحة لكل شيء مثل هذا:

Object.defineProperty(Object.prototype, "length", {
get() {
    if (!Object.keys) {
        Object.keys = function (obj) {
            var keys = [],k;
            for (k in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, k)) {
                    keys.push(k);
                }
            }
            return keys;
        };
    }
    return Object.keys(this).length;
},});

console.log({"Name":"Joe","Age":26}.length) //returns 2

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

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(قدم Firefox خاصية __count__ سحرية ، ولكن تمت إزالة هذا في مكان ما حول الإصدار 4.)


إذا كنت تستخدم Underscore.js يمكنك استخدام _.size (بفضلdouwe):
_.size(obj)

بدلاً من ذلك ، يمكنك أيضًا استخدام _.keys التي قد تكون أكثر وضوحًا للبعض:
_.keys(obj).length

أنا أوصي Underscore ، في مكتبة ضيقة للقيام بالكثير من الأشياء الأساسية. كلما كان ذلك ممكنا فإنها تطابق ECMA5 وتأجيل التنفيذ الأصلي.

خلاف ذلك أنا أؤيد الإجابة @ آفي. قمت بتحريره لإضافة رابط إلى مستند MDC الذي يتضمن مفاتيح () الطريقة التي يمكنك إضافتها إلى متصفحات غير ECMA5.


إذا لم يعمل jQuery أعلاه ، فحاول

$(Object.Item).length

بالنسبة لأولئك الذين لديهم Ext JS 4 في مشروعهم ، يمكنك القيام بما يلي:

Ext.Object.getSize(myobj);

ميزة هذا أنها ستعمل على جميع المتصفحات المتوافقة مع (متضمنة IE6-IE8) ، ومع ذلك ، أعتقد أن وقت التشغيل ليس أفضل من O (n) ، كما هو الحال مع الحلول المقترحة الأخرى.



كما أجاب أعلاه: Object.keys(obj).length

ولكن: كما لدينا الآن فئة حقيقية Map في ES6 ، suggest استخدامها بدلاً من استخدام خصائص كائن.

const map = new Map();
map.set("key", "value");
map.size; // THE fastest way

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

function BasicList()
{
   var items = {};
   this.count = 0;

   this.add = function(index, item)
   {
      items[index] = item;
      this.count++;
   }

   this.remove = function (index)
   {
      delete items[index];
      this.count--;
   }

   this.get = function(index)
   {
      if (undefined === index)
        return items;
      else
        return items[index];
   }
}

لا أعتقد أن هذا ممكن (على الأقل ليس بدون استخدام بعض internals). وأنا لا أعتقد أنك ستكسب الكثير من خلال تحسين هذا.


لست على دراية بأي طريقة للقيام بذلك ، ولكن للحفاظ على التكرار إلى الحد الأدنى ، يمكنك محاولة التحقق من وجود __count__ وإذا لم يكن موجودًا (أي ليس فايرفوكس) ، فيمكنك التكرار فوق الكائن و تعريفه للاستخدام في وقت لاحق على سبيل المثال:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

وبهذه الطريقة ، __count__ أي متصفح يدعم __count__ ذلك ، وسيتم تنفيذ التكرارات فقط لتلك التي لا تدعم ذلك. إذا تغير العدد ولا يمكنك فعل ذلك ، يمكنك دائمًا جعله وظيفة:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

بهذه الطريقة في أي وقت يمكنك الرجوع myobj. __count__ ستقوم الدالة إطلاق وإعادة حساب.


للتكرار على Avi Flax answer Object.keys (obj) .length صحيح لكائن لا يحتوي على وظائف مرتبطة به

مثال:

obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2

مقابل

arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
    _.each(obj, function(a){
        arr.push(a);
    });
};
Object.keys(obj).length; // should be 3 because it looks like this 
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */

خطوات لتجنب هذا:

  1. لا تضع وظائف في كائن تريد حساب عدد المفاتيح فيه

  2. استخدام كائن منفصل أو إنشاء كائن جديد خصيصًا Object.keys(obj).length إذا كنت تريد حساب عدد الدالات الموجودة في الملف باستخدام Object.keys(obj).length )

أيضا نعم استخدمت وحدة _ أو الشرطة السفلية من nodejs في المثال الخاص بي

يمكن العثور على وثائق هنا Underscore.js فضلا عن مصدرها على جيثوب ومعلومات أخرى مختلفة

وأخيرا تطبيق lodash https://lodash.com/docs#size

_.size(obj)


من: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty (obj، prop، descriptor)

يمكنك إما إضافته إلى جميع الأشياء الخاصة بك:

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

أو كائن واحد:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

مثال:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "[email protected]";
myObj.length; //output: 2

تمت إضافة هذه الطريقة ، لن يتم عرضها في for..in loops:

for(var i in myObj) {
     console.log(i + ":" + myObj[i]);
}

انتاج:

name:John Doe
email:[email protected]

ملاحظة: أنه لا يعمل في <المتصفحات IE9.


يمكنك استخدام هذا الرمز:

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

ثم يمكنك استخدام هذا في المتصفحات القديمة أيضًا:

var len = Object.keys(obj).length;




key