Выбрать главу

var dense = sparse.filter(function() { return true; });

А чтобы уплотнить массив и удалить из него все элементы со значениями undefined и null, можно использовать метод filter(), как показано ниже:

а = a.filter(function(x) { return х !== undefined && х != null; });

7.9.4. Методы every() и some()

Методы every() и some() являются предикатами массива: они применяют указанную функцию-предикат к элементам массива и возвращают true или false. Метод every() напоминает математический квантор всеобщности V: он возвращает true, только если переданная вами функция-предикат вернула true для всех элементов массива:

а = [1,2,3,4,5];

a.every(function(x) { return х < 10; }) // => true: все значения < 10.

a.every(function(x) { return х % 2 === 0; }) // => false: не все четные.

Метод some() напоминает математический квантор существования 3: он возвращает true, если в массиве имеется хотя бы один элемент, для которого функция-предикат вернет true, а значение false возвращается методом, только если функция-предикат вернет false для всех элементов массива:

а = [1,2,3,4, 5];

a.some(function(x) { return х%2===0; }) // => true: имеются четные числа,

a.some(isNaN) // => false: нет нечисловых элементов.

Обратите внимание, что оба метода, every() и some(), прекращают обход элементов массива, как только результат становится известен. Метод some() возвращает true, как только функция-предикат вернет true, и выполняет обход всех элементов массива, только если функция-предикат всегда возвращает false. Метод every() является полной противоположностью: он возвращает false, как только функция-предикат вернет false, и выполняет обход всех элементов массива, только если функция-предикат всегда возвращает true. Кроме того, отметьте, что в соответствии с правилами математики для пустого массива метод everу() возвращает true, а метод some() возвращает false.

7.9.5. Методы reduce() и reduceRight()

Методы reduce() и reduceRight() объединяют элементы массива, используя указанную вами функцию, и возвращают единственное значение. Это типичная операция в функциональном программировании, где она известна также под названием «свертка». Примеры ниже помогут понять суть этой операции:

var а = [1,2,3,4,5]

var sum = a.reduce(function(x,у) { return х+у }, 0); // Сумма значений

var product = a.reduce(function(x,у) { return х*у }, 1); // Произвел, значений

var max = a.reduce(function(x,у) { return (х>у)?х:у; }); // Наибольш. значение

Метод reduce() принимает два аргумента. В первом передается функция, которая выполняет операцию свертки. Задача этой функции - объединить некоторым способом или свернуть два значения в одно и вернуть свернутое значение. В примерах выше функции выполняют объединение двух значений, складывая их, умножая и выбирая наибольшее. Во втором (необязательном) аргументе передается начальное значение для функции.

Функции, передаваемые методу reduce(), отличаются от функций, передаваемых методам forEach() и map(). Знакомые уже значение, индекс и массив передаются им во втором, третьем и четвертом аргументах. А в первом аргументе передается накопленный результат свертки. При первом вызове в первом аргументе функции передается начальное значение, переданное методу reduce() во втором аргументе. Во всех последующих вызовах передается значение, полученное в результате предыдущего вызова функции. В первом примере, из приведенных выше, функция свертки сначала будет вызвана с аргументами 0 и 1. Она сложит эти числа и вернет 1. Затем она будет вызвана с аргументами 1 и 2 и вернет 3. Затем она вычислит 3+3=6, затем 6+4=10 и, наконец, 10+5=15. Это последнее значение 15 будет возвращено методом reduce().

Возможно, вы обратили внимание, что в третьем вызове, в примере выше, методу reduce() передается единственный аргумент: здесь не указано начальное значение. Когда метод reduce() вызывается без начального значения, как в данном случае, в качестве начального значения используется первый элемент массива. Это означает, что при первом вызове функции свертки будут переданы первый и второй элементы массива. В примерах вычисления суммы и произведения точно так же можно было бы опустить аргумент с начальным значением.