Reducer Выполняет функцию (предоставленную как аргумент для восстановления) на каждом элементе массива, что приводит к одному выводному значению.
Пользовательская функция редуктора
const reducer = (array, cb, init) => {
let result = init
for(let i = 0; i < array.length; i++)
result = cb(result, array[i], i, array)
return result
}
1. Расчет длины массива с использованием редуктора
const length = (array) => reducer(array, (total, currEle) => total+1 ,0) const list = [1, 2, 3] console.log(length(list)) // 3
2. Реализация карты с использованием редуктора
const map = (array, cb) => reducer(array, (acc, currEle) => [...acc ,cb(currEle)] ,[]) const double = n => n * 2 const list = [10, 20, 30, 40] console.log(map(list, double)) //[ 20, 40, 60, 80 ]
3. Реализация фильтра с использованием редуктора
const filter = (array, cb) => reducer(array, (acc, currEle) => cb(currEle) ? [...acc , currEle] : acc ,[]) const isGreaterThanTwo = n => n > 2 const list = [1, 2, 3, 4] console.log(filter(list, isGreaterThanTwo)) //[ 3, 4 ]
4. Реализация плоской карты с использованием редуктора
const map = (array, cb) => reducer(array, (acc, currEle) => [...acc ,cb(currEle)] ,[]) const flatMap = (array, cb) => reducer(array, (acc, currEle) => [...acc , ...map(currEle, cb)] ,[]) const double = n => n * 2 const twoDList = [[1], [2]] console.log(flatMap(twoDList, double)) //[ 2, 4 ]
5. Реализация Foreach с использованием Reducer
const forEach = (array, cb) => reducer(array, (acc, currEle) => cb(currEle) ,null) const printDouble = n => console.log(n * 2) const list = [20, 40, 50] forEach(list, printDouble) /* output: 40 80 100 */
6. Реализация реверса с использованием редуктора
const reverse = (array, cb) => reducer(array, (acc, currEle) => [currEle, ...acc] ,[]) const list = ["a", "b"] console.log(reverse(list)) //[ 'b', 'a' ]
7. Реализация каждого использования редуктора
const every = (array, condition) => reducer(array, (acc, currEle) => acc && !!condition(currEle), true) const list = [3, 6] const isDivisibleByThree = e => e % 3 === 0 console.log(every(list, isDivisibleByThree)) // true
Оригинал: “https://dev.to/sakethkowtha/power-of-js-reducer-1k5o”