Создать функцию из reduce, аналогичную map

Всем привет! Дали подобное задание. Я его выполнил простым способом и все работает.

const mapReduce = (array) => {
   return array.reduce((collection, element) => {
      return [...collection, element];
   }, []);
};

Но в задании говорится следующее: Реализовать функцию со следующими сигнатурами

map<T, V>(callback: (element: T) => V, collection: T[]): V[]

Как это можно реализовать? Я понимаю что <T, V> - это дженерики, для указания типа. Но не представляю как это использовать с reduce?


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

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

Сигнатура

map<T, V>(callback: (element: T) => V, collection: T[]): V[]

указывает но следующее:

  1. функция принимает два параметра: callback, collection
  2. функция возвращает новый массив

Соответственно в код необходимо добавить один параметр

const mapReduce = (callback, collection) => {

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

Исходя из этого код может выглядеть так:

const mapReduce = (callback, collection) => {
   return collection.reduce((acc, element) => {
      return [...acc, callback(element)];
   }, []);
};

Также можно отметить, что размер конечного массива известен заранее и совпадает с размером исходного массива. Поэтому можно заранее создать массив нужного размера и просто заполнить его, не создавая новый массив на каждой итерации:

const mapReduce = (callback, collection) => {
   return collection.reduce((acc, element, index) => {
      acc[index] = callback(element);
      return acc;
   }, new Array(collection.length));
};
→ Ссылка