<b>var data = [1,2,3,4,5]; // Массив, элементы которого будут суммироваться </b>
<b>// Найти сумму элементов массива</b>
<b>var sum =0; // Начальное значение суммы 0</b>
<b>data.forEach(function(value) { sum += value; }); // Прибавить значение к sum </b>
<b>sum // => 15</b>
<b>// Увеличить все элементы массива на 1</b>
<b>data.forEach(function(v, і, а) { а[і] = v + 1; });</b>
<b>data // => [2,3,4,5,6]</b>
Обратите внимание, что метод
<b>fогEach()</b>
не позволяет прервать итерации, пока все элементы не будут переданы функции. То есть отсутствует эквивалент инструкции
<b>break</b>
, которую можно использовать с обычным циклом
<b>for</b>
. Если потребуется прервать итерации раньше, внутри функции можно возбуждать исключение, а вызов
<b>forEach()</b>
помещать в блок
<b>try</b>
. Ниже демонстрируется функция
<b>foreach()</b>
, вызывающая метод
<b>forEach()</b>
внутри такого блока
<b>try</b>
. Если функция, которая передается функции
<b>foreach()</b>
, возбудит исключение
<b>foreach.break</b>
, цикл будет прерван преждевременно:
<b>function foreach(a,f,t) { </b>
<b> try { </b>
<b> a.forEach(f,t); </b>
<b> } catch(e) {</b>
<b> if (e === foreach.break) </b>
<b> return; </b>
<b> else throw e;</b>
<b> }</b>
<b>}</b>
<b>foreach.break = new Error("StopIteration");</b>
7.9.2. Метод map()
Метод
<b>map()</b>
передает указанной функции каждый элемент массива, относительно которого он вызван, и возвращает массив значений, возвращаемых этой функцией. Например:
<b>а = [1, 2, 3];</b>
<b>b = a.map(function(x) { return х*х; }); // b = [1, 4, 9]</b>
Метод
<b>map()</b>
вызывает функцию точно так же, как и метод
<b>forEach()</b>
. Однако функция, передаваемая методу
<b>map(),</b>
должна возвращать значение. Обратите внимание, что
<b>map()</b>
возвращает новый массив: он не изменяет исходный массив. Если исходный массив является разреженным, возвращаемый массив также будет разреженным: он будет иметь ту же самую длину и те же самые отсутствующие элементы.
7.9.3. Метод filter()
Метод
<b>filter()</b>
возвращает массив, содержащий подмножество элементов исходного массива. Передаваемая ему функция должна быть функцией-предикатом, т.е. должна возвращать значение
<b>true</b>
или
<b>false</b>
. Метод
<b>filter()</b>
вызывает функцию точно так же, как методы
<b>forEach()</b>
и
<b>map()</b>
. Если возвращается
<b>true</b>
или значение, которое может быть преобразовано в
<b>true</b>
, переданный функции элемент считается членом подмножества и добавляется в массив, возвращаемый методом. Например:
<b>а = [5, 4, 3, 2, 1];</b>
<b>smallvalues = a.filter(function(x) { return х < 3 }); // [2, 1]</b>
<b>everyother = a.filter(function(x,і) { return і%2==0 }); // [5, 3, 1]</b>
Обратите внимание, что метод
<b>filter()</b>
пропускает отсутствующие элементы в разреженных массивах и всегда возвращает плотные массивы. Чтобы уплотнить разреженный массив, можно выполнить следующие действия:
<b>var dense = sparse.filter(function() { return true; });</b>
А чтобы уплотнить массив и удалить из него все элементы со значениями undefined и null, можно использовать метод
<b>filter()</b>
, как показано ниже:
<b>а = a.filter(function(x) { return х !== undefined && х != null; });</b>
7.9.4. Методы every() и some()
Методы
<b>every()</b>
и
<b>some()</b>
являются предикатами массива: они применяют указанную функцию-предикат к элементам массива и возвращают
<b>true</b>
или
<b>false</b>
. Метод
<b>every()</b>
напоминает математический квантор всеобщности V: он возвращает
<b>true</b>
, только если переданная вами функция-предикат вернула
<b>true</b>
для всех элементов массива:
<b>а = [1,2,3,4,5];</b>
<b>a.every(function(x) { return х < 10; }) // => true: все значения < 10.</b>
<b>a.every(function(x) { return х % 2 === 0; }) // => false: не все четные.</b>
Метод
<b>some()</b>
напоминает математический квантор существования 3: он возвращает
<b>true</b>
, если в массиве имеется хотя бы один элемент, для которого функция-предикат вернет
<b>true</b>
, а значение
<b>false</b>
возвращается методом, только если функция-предикат вернет
<b>false</b>
для всех элементов массива: