Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
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() пропускает отсутствующие элементы в разреженных массивах и всегда возвращает плотные массивы. Чтобы уплотнить разреженный массив, можно выполнить следующие действия:
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().
Интервал:
Закладка: