Предположим, что у меня есть следующий объект в JavaScript:
var object = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
};
Как узнать, сколько значений существует в объекте?
Предположим, что у меня есть следующий объект в JavaScript:
var object = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
};
Как узнать, сколько значений существует в объекте?
Нет простого ответа, потому что 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
прототип.
Вы можете сделать это, используя этот простой код:
Object.keys(myObject).length
Используйте underscore библиотеку, очень полезную: _.keys(obj).length
.
Вы можете выполнить итерацию по объекту, чтобы получить ключи или значения:
function numKeys(obj)
{
var count = 0;
for(var prop in obj)
{
count++;
}
return count;
}
Это похоже на "орфографическую ошибку", но просто хочу указать, что ваш пример является недопустимым синтаксисом, должен быть
var object = {"key1":"value1","key2":"value2","key3":"value3"};
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
Эта функция использует свойство 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;
EDIT: это приведет к ошибкам с jquery, а также к некоторым другим неудобствам. ВЫ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ЭТО: (возможно, если бы вместо функции публичного свойства можно было добавить приватный метод, это было бы нормально, но сейчас у вас нет времени). Сообщество wikied
не использовать:
Несмотря на то, что объект javascript по умолчанию не имеет функции count, классы легко расширяемы, и можно добавить его сами:
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 и вставить его в начале времени выполнения (до того, как вы вызовете счет).
Сообщите мне, если это сработает для вас!
С уважением, Педро
Для тех, кто прочитает этот вопрос/ответы, вот реализация JavaScript в коллекции словарей очень похожа на функциональность .NET: JavaScript Dictionary
Хотя это не будет "истинным объектом", вы всегда можете сделать что-то вроде этого:
var foo = [
{Key1: "key1"},
{Key2: "key2"},
{Key3: "key3"}
];
alert(foo.length); // === 3