2015-03-02 4 views
7

Это будет звучать очень глупый вопрос. Как найти точную длину массива в JavaScript; точнее, я хочу найти полные позиции, занятые в массиве.Найти длину массива в Javascript

У меня есть простой сценарий, который, как я думаю, большинство из вас может быть в курсе.

var a = [1,2,3]; 
a.length; //This will output 3 

Теперь, если я дать

a[100] = 100; 
a.length; // The output is 101; 

Я хочу, чтобы получить точный размер массива, который в приведенном выше случае должно быть 4.

+0

проверить первое неопределенное значение, если массив заполнен инкрементным порядком. – lateralus

+1

сделать цикл for и счетчик инкремента, отличный от 'undefined' –

+1

В массивах Javascript не создаются с ограниченной длиной, поэтому, когда вы делаете [0] = 1; a [100] = 100, длина становится '101'. Одна вещь, которую вы можете сделать, это loop from 0 -> array.length и отслеживать значения, которые не являются 'undefined' – Arkantos

ответ

17

Это даст вам количество элементов действительно присутствующих в массиве:

Object.keys(a).length 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Relationship_between_length_and_numerical_properties

редактировать

Как указано в комментариях по JLRishe, Object.keys (а) .length возвращает количество ключей, находящихся в объекте в. Если добавить ключ так:

a= [1,2,3]; 
a['key']= "akey"; 

затем Object.keys (а).Длина возвратит 4

но «ключ» не является частью массива, это свойство объекта массива, console.log (а) дает [1,2,3].

Таким образом, чтобы иметь более надежное значение количества элементов в массиве, мы должны рассчитывать ключевые значения только положительное целое число:

Object.keys(a).filter(function(el){return !(+el % 1) && +el>=0 && +el < Math.pow(2,32) ;}).length 

Object.keys возвращает массив String. Присвоение значения в массиве с a['1'] или a[1] эквивалентно. Клавиши указателя массива также должны быть меньше 2^32.

+0

Это должно работать большую часть времени, но будет неверным, если кто-то назначил нечисловые свойства массиву , – JLRishe

+0

Это вернет все ключи, числовые или нет. – Gael

+0

Да, это точно моя точка зрения. – JLRishe

3

TL; DR Самый простой надежный подход, который я может думать о следующем:

В современных двигателях JavaScript это может быть сокращено до:

var count = a.filter(() => true).length; 


Полный ответ:

Проверка на undefined не хватает, потому что массив может фактически содержать undefined значения.

Надежные способы, чтобы найти число элементов, которые ...

Используйте in оператор:

var count = 0; 
for (var i = 0; i < a.length; i += 1) { 
    if (i in a) { 
     count += 1; 
    } 
} 

использование .forEach() (который в основном используется in под капотом):

var a = [1, undefined, null, 7]; 
 
a[50] = undefined; 
 
a[90] = 10; 
 

 
var count = 0; 
 
a.forEach(function() { 
 
    count += 1; 
 
}); 
 

 
console.log(count); // 6

или использовать .filter() с предикатом, который всегда верно:

var a = [1, undefined, null, 7]; 
 
a[50] = undefined; 
 
a[90] = 10; 
 

 
var count = a.filter(function() { return true; }).length; 
 

 
console.log(count); // 6

+0

Вот почему мы не проверяем 'undefined'. Мы проверяем, не является ли это НЕ неопределенным и в этом случае увеличивает счетчик и повторяет это из 0 -> длины массива :) – Arkantos

+0

@Arkantos Проверка того, что каждый элемент не является 'undefined', может давать счет, который меньше фактического количества элементов, и это точно моя точка зрения. – JLRishe

+0

К сожалению, я ошибся .. Я говорил в контексте массива OP, где у него есть только целые числа в его массиве :) – Arkantos

0

Размер массива точно соответствует показателю свойства length.

, хотя вы дали значение только для первых трех позиций (0,1,2), когда вы дали значение 100 а [100], вы изменили его на 101 позицию. Таким образом, вы получите подсчет каждой позиции от 0 (первый индекс) до 100 (последний индекс), даже если они не имеют значения.

0

С вашим кодом: a[100] = 100, вы создаете блок в местоположении 100 в своем массиве. (Всего 101, начиная с 0).

Если вы хотите узнать, сколько фактических ответов в блоке вам нужно будет использовать цикл и цикл, проверяя, какие поля не равны неопределенным. Есть множество способов сделать это с for, while, foreach и т.д.

Просто реализовать счетчик и сосчитать секции в массиве, которые не равны null или undefined. Это даст вам количество мест, которые фактически используются в массиве.

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