Найти длину массива в 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. Это даст вам количество мест, которые фактически используются в массиве.