JavaScript. Подробное руководство, 6-е издание
Часть 82 из 535 Информация о книге
<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>напоминает математический квантор всеобщности V: он возвращает<b>every()</b>, только если переданная вами функция-предикат вернула<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>Метод
напоминает математический квантор существования 3: он возвращает<b>some()</b>, если в массиве имеется хотя бы один элемент, для которого функция-предикат вернет<b>true</b>, а значение<b>true</b>возвращается методом, только если функция-предикат вернет<b>false</b>для всех элементов массива:<b>false</b>