Предположим, у меня есть следующий объект в JavaScript:Как подсчитать атрибуты объекта JavaScript?
var object = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
};
Как узнать, сколько ценности существуют в объекте?
Предположим, у меня есть следующий объект в JavaScript:Как подсчитать атрибуты объекта 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.prototype. Просто используйте Object.prototype.hasOwnProperty.call (foo, k). –
Почему бы вам просто не сделать foo.hasOwnProperty (k). Я что-то упускаю? Я имею в виду, что даже тип JavaScript выводится из Object.prototype, и он будет иметь метод hasOwnProperty(). – bucabay
@Elijah: Я не понимаю, что случилось с тем, как я это сделал, но да, ваш путь тоже должен работать. –
Вы можете перемещаться по объекту, чтобы получить ключи или значения:
function numKeys(obj)
{
var count = 0;
for(var prop in obj)
{
count++;
}
return count;
}
Это выглядит как «орфографическая ошибка», но просто хочу отметить, что ваш пример является недействительным синтаксис, должен быть
var object = {"key1":"value1","key2":"value2","key3":"value3"};
Эта функция использует свойство 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;
Обратите внимание, что этот атрибут был устарел в Firefox 4 и удален вскоре после этого, поэтому он не присутствовал ни в одном браузере в течение нескольких лет. –
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 время выполнения (до вызова счетчика).
Дайте мне знать, если это сработает для вас!
С уважением, Педро
Привет. я использовал это некоторое время без проблем ... Единственная проблема, которую я обнаружил, заключается в том, что если вы зацикливаете объекты после имплементации этого свойства на всех объектах, он будет выполнять дополнительный цикл. Если кто-нибудь найдет рабочий стол, это будет здорово – droope
ОГРОМНЫЕ ПРОБЛЕМЫ С ЭТОЙ ОДИН – droope
Почему это вики? – Shaz
Хотя это не было бы «истинный объект», вы всегда можете сделать что-то вроде этого:
var foo = [
{Key1: "key1"},
{Key2: "key2"},
{Key3: "key3"}
];
alert(foo.length); // === 3
Мы пытаемся получить длину свойства. Таким образом, результат должен быть только 1 в вашем случае. – Santosh
Для тех, которые будут читать этот вопрос/ответ, здесь представляет собой реализацию JavaScript в коллекции словарей, очень похожей на функциональность.NET один: JavaScript Dictionary
Использование underscore библиотека, очень полезно: _.keys(obj).length
.
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
Вы можете сделать это с помощью этого простого кода:
Object.keys(myObject).length
Это далеко не полностью поддерживается: http://kangax.github.io/es5-compat-table/ – Andrew
@ Андрей, я бы не сказал, «далеко не полностью» Я скажем, не поддерживается в IE8 и ниже. Кроме того, [Polyfill] (http://jsperf.com/polyfill-object-keys). – hitautodestruct
Справедливо, он не поддерживается в IE8 или ниже. Если это проблема, проверьте наличие ключей() на Object (или try-catch) и отпустите. – Andrew
Держись! У JS нет кортежей и нет словарей. Это называется объектом (написанным в литеральной нотации), хотя он похож на словарь Python. Что вы называете кортежем в приведенном выше примере? –
Как вы предлагаете переименовать этот вопрос? –
Может быть, «атрибуты» вместо «кортежей»? Это предполагает, что вы хотите, чтобы ответ был равен 3 с вышеуказанным «объектом». –