Создать функцию map с учетом уже имеющейся функции forEach

В задании необходимо создать функцию map с учетом уже имеющейся функции forEach. Когда передается function (el) { return el * 2; } в функцию forEach каждый элемент умножается на 2, но сам forEach не возвращает каждый элемент умноженный на 2. Не могу понять, где ошибка.

function forEach(arr, func){
  for(let el of arr){
    func(el);
  }
}

function map(arr, func){
    let res;
    let result = [...arr];
    res = result.push(forEach(result, func));
    console.log(result);
}
map([1, 2, 3, 4, 5], function (el) { return el * 2; });


Ответы (1 шт):

Автор решения: Leonid

Map делает копию массива, в которую помещает результат обработки каждого элемента исходного массива.

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

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

Здесь надо понимать, что массивы передаются в функции по ссылке. Поэтому, когда мы передаем пустой массив result в функцию-коллбэк forEach, то любые изменения с ним отражаются и здесь, внутри map. И наоборот, передавая arr в качестве аргумента в forEach, каждый элемент этого массива (будучи примитивными) передается в коллбэк по значению и на этот массив никак не отражается.

function forEach(arr, func){
  for(let el of arr){
    func(el);
  }
}

function map(arr, func){
    const result = [];
    forEach(arr, el => {
        result.push(func(el));
    })
    return result;
}

let array = [1,2,3,4,5];
let mapped_array = map(array, el => el*2);

console.log('Initial array: ', array);
console.log('Mapped array: ', mapped_array);

→ Ссылка