Найти длину массива в Javascript
Это будет звучать очень глупый вопрос. Как найти точную длину массива в JavaScript; точнее, я хочу найти полные позиции, занятые в массиве.
У меня есть простой сценарий, который, как я полагаю, большинство из вас может знать.
var a = [1,2,3];
a.length; //This will output 3
Теперь, если я даю
a[100] = 100;
a.length; // The output is 101;
Я хочу получить точный размер массива, который в приведенном выше случае должен быть 4.
Ответы
Ответ 1
Это даст вам количество элементов, реально присутствующих в вашем массиве:
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(a).length возвращает количество ключей, присутствующих в объекте a.
Если я добавлю такой ключ:
a= [1,2,3];
a['key']= "akey";
то Object.keys(a).length вернет 4
но "ключ" не является частью массива, это свойство массива Object,
console.log(a) дает вам [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.
Ответ 2
TL; DR Самый простой надежный подход, который я могу придумать, заключается в следующем:
var count = a.filter(function() { return true; }).length;
В современных машинах 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
Ответ 3
размер массива - это именно то, что показано свойством length.
хотя вы указали значение только на первые 3 позиции (0,1,2), когда вы дали значение 100 а [100], вы изменили его на 101 позицию. Таким образом, вы получите счетчик каждой позиции от 0 (первый индекс) до 100 (последний индекс), даже если они не имеют значения.
Ответ 4
С вашим кодом: a[100] = 100
вы создаете блок в местоположении 100 в своем массиве. (Всего 101, начиная с 0).
Если вы хотите узнать, сколько фактических ответов в блоке вам нужно будет использовать цикл и цикл, проверяя, какие поля не равны undefined. Есть несколько способов сделать это с помощью for
, while
, foreach
и т.д.
Просто выполните счетчик и подсчитайте разделы в массиве, которые не равны null
или undefined
. Это даст вам количество мест, которые фактически используются в массиве.