JavaScript

Чем отличается filter от map? Не вижу разницы

Все они перебирают массив и применяют указанное действие для каждого элемента массива. Не могу понять в чём разница. Объясните пожалуйста по возможности на языке близким к обычному человеку, без математических вузов и ученой степени
map не меняет длину массива: Сколько элементов получил, столько и возвращает, назначение: Получить новый массив, в котором по какому-то правилу (функции) изменены все элементы исходного массива.

filter, собстно, фильтрует: Если функция для данного элемента вернет false, он не попадет в финальный массив... Исходные значения при этом желательно не трогать. Хотя можно и менять.

А на уровне кода, отличаются так:

Array.prototype.my_map = function(fn) {
  var result = [];
  for (var i = 0; i < this.length; i++) {
    result.push( fn(this[i], i, this) );
    // что вернет функция - пойдет в возвращаемый массив.
  }
  return result;
}

Array.prototype.my_filter = function(fn) {
  var result = [];
  for (var i = 0; i < this.length; i++) {
    if ( fn(this[i], i, this) ) result.push(this[i]);
    // только если функция вернет true
  }
  return result;
}

console.log( [1, 2, 3].my_map(e => e * 2) ); // [2, 4, 6]
console.log( [1, 2, 3].my_filter(e => e < 2) ); // [1]
Жангелди Сулеименов
Жангелди Сулеименов
62 360
Лучший ответ
Сергей Димитриев Если я с помощью map верну из массива только честные числа, код ведь все равно сработает? Так зачем для этого использовать filter?
Разница в том что у них разные назначения. Map - трансформация массива. Filter - как не трудно догадаться, фильтрация
Алексей Сурнин
Алексей Сурнин
50 591
Разница в том, что эти функции возвращают. filter - отбирает те элементы, для которых функция вернула true. А map - возвращает массив из элементов исходного массива после применения к ним функции.
Иван Егрищин
Иван Егрищин
62 927
Сергей Димитриев Если я с помощью map верну из массива только честные числа, код ведь все равно сработает? Так зачем для этого использовать filter?
ну не видишь - и керсним!
Дмитрий
Дмитрий
881