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

7.9.1. Метод forEach()

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

var data = [1,2,3,4,5]; // Массив, элементы которого будут суммироваться

// Найти сумму элементов массива

var sum =0; // Начальное значение суммы 0

data.forEach(function(value) { sum += value; }); // Прибавить значение к sum

sum // => 15

// Увеличить все элементы массива на 1

data.forEach(function(v, і, а) { а[і] = v + 1; });

data // => [2,3,4,5,6]

Обратите внимание, что метод fогEach() не позволяет прервать итерации, пока все элементы не будут переданы функции. То есть отсутствует эквивалент инструкции break, которую можно использовать с обычным циклом for. Если потребуется прервать итерации раньше, внутри функции можно возбуждать исключение, а вызов forEach() помещать в блок try. Ниже демонстрируется функция foreach(), вызывающая метод forEach() внутри такого блока try. Если функция, которая передается функции foreach(), возбудит исключение foreach.break, цикл будет прерван преждевременно:

function foreach(a,f,t) {

  try {

    a.forEach(f,t);

  } catch(e) {

    if (e === foreach.break)

      return;

    else throw e;

  }

}

foreach.break = new Error("StopIteration");

7.9.2. Метод map()

Метод map() передает указанной функции каждый элемент массива, относительно которого он вызван, и возвращает массив значений, возвращаемых этой функцией. Например:

а = [1, 2, 3];

b = a.map(function(x) { return х*х; }); // b = [1, 4, 9]

Метод map() вызывает функцию точно так же, как и метод forEach(). Однако функция, передаваемая методу map(), должна возвращать значение. Обратите внимание, что map() возвращает новый массив: он не изменяет исходный массив. Если исходный массив является разреженным, возвращаемый массив также будет разреженным: он будет иметь ту же самую длину и те же самые отсутствующие элементы.

7.9.3. Метод filter()

Метод filter() возвращает массив, содержащий подмножество элементов исходного массива. Передаваемая ему функция должна быть функцией-предикатом, т.е. должна возвращать значение true или false. Метод filter() вызывает функцию точно так же, как методы forEach() и map(). Если возвращается true или значение, которое может быть преобразовано в true, переданный функции элемент считается членом подмножества и добавляется в массив, возвращаемый методом. Например:

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

smallvalues = a.filter(function(x) { return х < 3 }); // [2, 1]

everyother = a.filter(function(x,і) { return і%2==0 }); // [5, 3, 1]

Обратите внимание, что метод filter() пропускает отсутствующие элементы в разреженных массивах и всегда возвращает плотные массивы. Чтобы уплотнить разреженный массив, можно выполнить следующие действия: