Подтвердить что ты не робот

Количество элементов "Определенных" элементов массива

Указанный следующий массив:

var arr = [undefined, undefined, 2, 5, undefined, undefined];

Я хотел бы получить количество элементов, которые определены (т.е. те, которые не являются undefined). Есть ли хороший способ сделать это, кроме цикла по массиву?

4b9b3361

Ответ 1

В последнем браузере вы можете использовать filter

var size = arr.filter(function(value) { return value !== undefined }).length;

console.log(size);

Другой метод, если браузер поддерживает indexOf для массивов:

var size = arr.slice(0).sort().indexOf(undefined);

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

console.log(arr.join("").length);

Есть несколько методов, которые вы можете использовать, но в конце мы должны увидеть, действительно ли это стоит делать вместо цикла.

Ответ 2

Массив length - это не количество элементов в массиве, это самый высокий index + 1. length свойство будет сообщать правильный счетчик элементов, только если есть допустимые элементы в последовательных индексах.

var a = [];
a[23] = 'foo';
a.length;  // 24

Сказать, что невозможно исключить элементы undefined из count без использования какой-либо формы цикла.

Ответ 3

Нет, единственный способ узнать, сколько элементов не undefined - это прокрутить и подсчитать их. Это не значит, что вам нужно написать цикл, хотя, просто что-то, где-то это нужно. (См. № 3 ниже, почему я добавил это оговорку.)

Как вы перебираете и считаете, что это зависит от вас. Существует множество способов:

  • Стандартный цикл for от 0 до arr.length - 1 (включительно).
  • A for..in loop при условии, что вы берете правильные меры предосторожности.
  • Любая из нескольких новых функций массива из ECMAScript5 (при условии, что вы используете движок JavaScript, который их поддерживает, или вы включили прокладку ES5, поскольку все они могут быть затянуты), например some, filter, или reduce, передавая соответствующую функцию. Это удобно не только потому, что вам не нужно явно писать цикл, а потому, что использование этих функций дает механизму JavaScript возможность оптимизировать цикл, который он делает внутренне различными способами. (Фактически ли это будет изменяться в зависимости от двигателя.)

... но все это равносильно циклу, либо явно, либо (в случае новых функций массива) неявно.

Ответ 4

К сожалению, нет. Вам нужно пройти цикл и посчитать их.

EDIT:

var arrLength = arr.filter(Number);
alert(arrLength);

Забастовкa >

Ответ 5

Цикл и количество во всех браузерах:

var cnt = 0;
for (var i = 0; i < arr.length; i++) {
    if (arr[i] !== undefined) {
        ++cnt;
    }
}

В современных браузерах:

var cnt = 0;
arr.foreach(function(val) {
    if (val !== undefined) { ++cnt; }
})

Ответ 6

Если undefined неявны, вы можете сделать:

var len = 0;
for (var i in arr) { len++ };

undefined являются неявными, если вы не устанавливаете их явно

//both are a[0] and a[3] are explicit undefined
var arr = [undefined, 1, 2, undefined];

arr[6] = 3;
//now arr[4] and arr[5] are implicit undefined

delete arr[1]
//now arr[1] is implicit undefined

arr[2] = undefined
//now arr[2] is explicit undefined

Ответ 7

Удалите значения, затем проверьте (удалите нуль здесь, если хотите)

const x = A.filter(item => item !== undefined || item !== null).length

С Lodash

const x = _.size(_.filter(A, item => !_.isNil(item)))