2009-08-28 3 views
138

Предположим, у меня есть следующий объект в JavaScript:Как подсчитать атрибуты объекта JavaScript?

var object = { 
    "key1": "value1", 
    "key2": "value2", 
    "key3": "value3" 
}; 

Как узнать, сколько ценности существуют в объекте?

+7

Держись! У JS нет кортежей и нет словарей. Это называется объектом (написанным в литеральной нотации), хотя он похож на словарь Python. Что вы называете кортежем в приведенном выше примере? –

+0

Как вы предлагаете переименовать этот вопрос? –

+0

Может быть, «атрибуты» вместо «кортежей»? Это предполагает, что вы хотите, чтобы ответ был равен 3 с вышеуказанным «объектом». –

ответ

97

Нет ответа, потому что Object —, который каждый объект в JavaScript получает от —, включает в себя множество атрибутов автоматически, и точный набор атрибутов, которые вы получаете, зависит от конкретного интерпретатора и того, что выполнил код перед вашим. Таким образом, вы каким-то образом должны отделять те, которые вы определили, от тех, которые вы получили «бесплатно».

Вот один из способов:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"}; 
Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted 

var count = 0; 
for (var k in foo) { 
    if (foo.hasOwnProperty(k)) { 
     ++count; 
    } 
} 
alert("Found " + count + " properties specific to foo"); 

Вторая строка показывает, как другой код может добавить свойства для всех Object производных. Если вы удалите ошибку hasOwnProperty() внутри цикла, счетчик свойств будет увеличиваться как минимум до 4. На странице с другим JavaScript, кроме этого кода, он может быть выше 4, если этот другой код также модифицирует прототип Object.

+2

Нельзя использовать пустой объект для доступа к Object.prototype. Просто используйте Object.prototype.hasOwnProperty.call (foo, k). –

+0

Почему бы вам просто не сделать foo.hasOwnProperty (k). Я что-то упускаю? Я имею в виду, что даже тип JavaScript выводится из Object.prototype, и он будет иметь метод hasOwnProperty(). – bucabay

+0

@Elijah: Я не понимаю, что случилось с тем, как я это сделал, но да, ваш путь тоже должен работать. –

11

Вы можете перемещаться по объекту, чтобы получить ключи или значения:

function numKeys(obj) 
{ 
    var count = 0; 
    for(var prop in obj) 
    { 
     count++; 
    } 
    return count; 
}

Это выглядит как «орфографическая ошибка», но просто хочу отметить, что ваш пример является недействительным синтаксис, должен быть

var object = {"key1":"value1","key2":"value2","key3":"value3"}; 

5

Эта функция использует свойство Mozilla __count__, если оно доступно, поскольку оно выполняется быстрее, чем итерация по каждому свойству.

function countProperties(obj) { 
    var count = "__count__", 
    hasOwnProp = Object.prototype.hasOwnProperty; 

    if (typeof obj[count] === "number" && !hasOwnProp.call(obj, count)) { 
    return obj[count]; 
    } 
    count = 0; 
    for (var prop in obj) { 
    if (hasOwnProp.call(obj, prop)) { 
     count++; 
    } 
    } 
    return count; 
}; 

countProperties({ 
    "1": 2, 
    "3": 4, 
    "5": 6 
}) === 3; 
+0

Обратите внимание, что этот атрибут был устарел в Firefox 4 и удален вскоре после этого, поэтому он не присутствовал ни в одном браузере в течение нескольких лет. –

3

EDIT: это случае обнаружения ошибок с JQuery, чтобы это произошло, а также некоторые другие неудобства. ВАМ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ: (возможно, если бы вместо функции публичного свойства можно было добавить приватный метод, это было бы нормально, но сейчас у вас нет времени). Сообщество wikied

не используют:

Даже если объект в JavaScript по умолчанию не имеет функции подсчета, классы легко расширяемый, и можно добавить его себя:

Object.prototype.count = function() { 
    var count = 0; 
    for(var prop in this) { 
     if(this.hasOwnProperty(prop)) 
      count = count + 1; 
    } 
    return count; 
} 

Так что после что можно выполнить

var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'}; 
console.log(object.count()); // 3 

в заключение, если вы хотите рассчитывать функциональность объектов, вам необходимо скопировать код из блока кода 1, и вставить его в начале я n время выполнения (до вызова счетчика).

Дайте мне знать, если это сработает для вас!

С уважением, Педро

+0

Привет. я использовал это некоторое время без проблем ... Единственная проблема, которую я обнаружил, заключается в том, что если вы зацикливаете объекты после имплементации этого свойства на всех объектах, он будет выполнять дополнительный цикл. Если кто-нибудь найдет рабочий стол, это будет здорово – droope

+0

ОГРОМНЫЕ ПРОБЛЕМЫ С ЭТОЙ ОДИН – droope

+0

Почему это вики? – Shaz

-3

Хотя это не было бы «истинный объект», вы всегда можете сделать что-то вроде этого:

var foo = [ 
    {Key1: "key1"}, 
    {Key2: "key2"}, 
    {Key3: "key3"} 
]; 

alert(foo.length); // === 3 
+0

Мы пытаемся получить длину свойства. Таким образом, результат должен быть только 1 в вашем случае. – Santosh

1

Для тех, которые будут читать этот вопрос/ответ, здесь представляет собой реализацию JavaScript в коллекции словарей, очень похожей на функциональность.NET один: JavaScript Dictionary

44

Использование underscore библиотека, очень полезно: _.keys(obj).length.

+3

Кажется очень полезной библиотекой. –

+0

Я использую его, очень круто. Спасибо, Александр. – Wolf87

+6

С помощью underscore.js вы можете использовать _.size (obj). – GijsjanB

12
var miobj = [ 
    {"padreid":"0", "sw":"0", "dtip":"UNO", "datos":[]}, 
    {"padreid":"1", "sw":"0", "dtip":"DOS", "datos":[]} 
]; 
alert(miobj.length) //=== 2 

но

alert(miobj[0].length) //=== undefined 

эта функция очень хорошо

Object.prototype.count = function() { 
    var count = 0; 
    for(var prop in this) { 
     if(this.hasOwnProperty(prop)) 
      count = count + 1; 
    } 
    return count; 
} 

alert(miobj.count()) // === 2 
alert(miobj[0].count()) // === 4 
+0

Добро пожаловать!Рассмотрите возможность именования переменных и данных на английском языке ;-) – atxe

+3

Расширение родных объектов - плохая практика. Не делай этого. – nkm

+0

, когда я использую этот код, то самозагрузки выпадающий не работает –

421

Вы можете сделать это с помощью этого простого кода:

Object.keys(myObject).length 
+2

Это далеко не полностью поддерживается: http://kangax.github.io/es5-compat-table/ – Andrew

+16

@ Андрей, я бы не сказал, «далеко не полностью» Я скажем, не поддерживается в IE8 и ниже. Кроме того, [Polyfill] (http://jsperf.com/polyfill-object-keys). – hitautodestruct

+0

Справедливо, он не поддерживается в IE8 или ниже. Если это проблема, проверьте наличие ключей() на Object (или try-catch) и отпустите. – Andrew

Смежные вопросы