Преобразование элементов

Функции map и filter имеют точно такую же сигнатуру, что и forEach, но они принципиально отличаются от последней тем, что, применяя некоторую логику к каждому элементу массива, они возвращают другой массив, оставляя оригинальный массив без изменений.

Программисты, использующие функциональные языки программирования (или даже языки программирования с функциональными расширениями, такие как Python), хорошо знают, что функции map и filter очень быстро приобретают высокую значимость, потому что они обеспечивают очень широкие возможности при таком кратком синтаксисе. Тем, кто не сталкивался с функцией map прежде, она может показаться загадочной. В действительности же ее имя говорит само за себя, потому что она создает отображение (mapping) массива, получаемое с помощью функции преобразования. Следующий пример иллюстрирует применение функции map:
var z = dojo.map([2,3,4], function(x) {
return x + 1
}); //вернет [3,4,5]
Для сравнения ниже приводится версия, которая создает аналогич
ный массив z, но без использования функции map:
var a = [2,3,4];
var z = [];
for (var i=0; i < a.length; i++) {
z.push(a[i] +1);
}

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


Кроме того, вы получаете те же преимущества от создания замыканий с помощью анонимных функций, когда использование переменных, полученных в результате промежуточных вычислений, при отказе от замыканий могло бы привести к загромождению контекста.

Имя функции filter тоже говорит само за себя, так как эта функция фильтрует массив согласно некоторому функциональному критерию. Ниже показано, как она используется:
dojo.filter([2,3,4], function(x) {
return x % 2 == 0
}); //вернет [2,4]

Реализация эквивалентного фрагмента программного кода не сложна, но требует большего внимания и дополнительных инструкций и, как следствие, увеличивает вероятность допустить опечатку или ошибку:
var a = [2,3,4];
var z = [];
for (var i=0; i < a.length; i++) {
if (a[i] % 2 == 0)
z.push(a[i]);
}

Как и в случае с другими функциями для работы с массивами, присутствующими в библиотеке Base, вы можете передавать функциям map и filter дополнительный параметр, определяющий контекст, если в этом есть необходимость:
function someContext() { this.y = 2; }
var context = new someContext;
dojo.filter([2,3,4], function(x) {return x % this.y==0}, context);
//вернет [2,4]

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
Аргументы «функции в виде строк»
Блочная модель
Грубое определение типа
Добавление узлов
Зачем управлять беспорядком

Вернуться в раздел: Dojo / Утилиты броузера