2015-08-07 6 views
6

Я попробовал этот способ, но он возвращает меня неправильный подсчет:Как я могу получить реальное количество массива?

myArr = []; 
myArr[666] = 'hello there'; 
console.log(myArr.length); // returns me 667 

Это должно быть 1. Как я могу иметь хороший счет в быстром способе?

+1

В Js число 0, как номер 1 Вот почему вы получаете 667. –

+0

http://stackoverflow.com/questions/7421013/why-does-5-6-8-71-2-8-in-javascript –

ответ

5

Поскольку массивы индексируются 0. [0...666] - 667 единиц. Если вы действительно хотите подсчитать количество элементов, которые у вас есть, массив может оказаться не лучшим решением.

17

Это должно быть 1.

Нет, это должно быть 667, потому что это как length определяется для стандартных массивов в JavaScript, которые aren't really arrays at all. Массивы в JavaScript - это , по сути, редкие, что означает, что в них могут быть отверстия (индексы, в которых не хранится никакое значение).

Как я могу получить хороший счет самым быстрым способом?

Единственный способ - зацикливание. Например:

var count = 0; 
myArr.forEach(function() { 
    ++count; 
}); 
console.log(count); 

... или через reduce как в maček's answer. forEach, reduce и другие подобные записи только для входа, которые фактически существуют, поэтому они пропускают отверстия в разреженных массивах.


Я должен упомянуть, что с IE8 до сих пор (Вздох) имеет справедливую часть доли на рынке, вы должны Призонная шайба forEach и reduce и такие на ней, если вы хотите использовать их. (Который легко.)

Чтобы сделать это без какого-либо шиммирования, и рассчитывать только фактические свойства индекса (не другие виды свойств), а затем свободно:

var count = 0, name; 
for (name in myArr) { 
    if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) { 
     ++count; 
    } 
} 

Это использует немного рыхлое определение того, что такое имя свойства индекса; если вы хотите получить надежный, см. раздел «Использовать для правильной» в this answer.

+1

мы находимся на одной странице, но 'сокращение', вероятно, немного чище –

+0

@ maček: Хех, вот я, старомодный ... –

+0

Нет проблем. +1 за предоставление дополнительного образования. –

4

Вы можете использовать Object.keys().

Object.keys(myArr).length; 

Из документации:

Object.keys возвращает массив, элементы которого являются строки, соответствующих к перечислимым свойствам найдены непосредственно на объект. Упорядочение свойств такое же, как и задание путем циклического изменения свойств объекта вручную.

Эта функция compatible with IE9+.Документация также содержит Funtion, которые могут быть добавлены для совместимости со всеми браузерами:

if (!Object.keys) Object.keys = function(o) { 
    if (o !== Object(o)) 
    throw new TypeError('Object.keys called on a non-object'); 
    var k=[],p; 
    for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p); 
    return k; 
} 
+1

Остерегайтесь того, что 'Object.keys' также будет содержать имена, не подлежащие индексированию, имена, если они существуют. –

+0

Предупреждение: 'Object.keys' недоступен в IE 8/7/6. – gusper

+3

@gusper: он может быть проецирован, если вы имеете дело с устаревшими браузерами. –

8

Вы можете подсчитать количество не неопределенных свойств с помощью уменьшения

var length = myArr.reduce(function(len) { return len+1; }, 0); 
console.log(length); // 1 
+0

Интересно, что [DaveGomez] (http://stackoverflow.com/users/1650483/dave-gomez) находит нечитаемым об этом. Это потрясающе. – canon

+1

@ canon yeah вы должны взять все с зерном соли здесь. Некоторые люди не знают, о чем они говорят. Я не утверждаю, что знаю все, но я стараюсь избегать предоставления ответов, которые не имеют определенной степени определенности. –

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