JavaScript. Подробное руководство, 6-е издание
Шрифт:
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
вызывается без начального значения, как в данном случае, в качестве начального значения используется первый элемент массива. Это означает, что при первом вызове функции свертки будут переданы первый и второй элементы массива. В примерах вычисления суммы и произведения точно так же можно было бы опустить аргумент с начальным значением. Вызов метода
reduce
с пустым массивом без начального значения вызывает исключение ТуреЕrror
. Если вызвать метод с единственным значением - с массивом, содержащим единственный элемент, и без начального значения или с пустым массивом и начальным значением - он просто вернет это единственное значение, не вызывая функцию свертки. Метод
reduceRight
действует точно так же, как и метод reduce, за исключением того, что массив обрабатывается в обратном порядке, от больших индексов к меньшим (справа налево). Это может потребоваться, если операция свертки имеет ассоциативность справа налево, например:
var а = [2, 3, 4]
// Вычислить 2^(3^4). Операция возведения в степень имеет ассоциативность справа налево
var big = a.reduceRight(function(accumulator,value) {
return Math.pow(value,accumulator);
});
Обратите внимание, что ни
reduce,
ни reduceRight
не принимают необязательный аргумент, определяющий значение this
внутри функции свертки. Его место занял необязательный аргумент с начальным значением. Если потребуется вызывать функцию свертки как метод конкретного объекта, можно воспользоваться методом Function.bind
.
Поделиться:
Популярные книги
Последний Паладин. Том 2
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Истребитель. Ас из будущего
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Честное пионерское! Часть 3
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Обгоняя время
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Страж. Тетралогия
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Магия чистых душ
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Имя нам Легион. Том 4
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Девятый
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Морской волк. 1-я Трилогия
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Отмороженный 8.0
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Совершенный: охота
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Калибр Личности 1
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Личник
3. Ермак
Фантастика:
альтернативная история
6.33