Метод уменьшения применяет функцию для каждого элемента массива и накапливает результат, итеративно из отправной точки, затем возвращает одно значение/объект.
Это начальное значение может быть указано или если не уменьшите, будет использовать первый элемент в массиве.
Большинство из этих примеров могут не быть решением для этой проблемы, но идея – проиллюстрировать, как мы можем использовать, чтобы их решить.
Хорошо, давайте начнем с.
Суммирование и умножение:
∑ a n d ∏ \ сумма и \ prod ∑ ан. d ∏
// Summation [3, 5, 4, 3, 6, 2, 3, 4].reduce((a, i) => a + i); // Without initial value [3, 5, 4, 3, 6, 2, 3, 4].reduce((a, i) => a + i, 5 ); // For clarity the above code is the same as [3, 5, 4, 3, 6, 2, 3, 4].reduce(function(a, i){return (a + i)}, 0 ); // Multiplication [3, 5, 4, 3, 6, 2, 3, 4].reduce((a, i) => a * i);
В этом примере вы можете оставить начальное значение, так как он будет схватить первый элемент в массиве, но вы также можете дать ему компенсирование или смещение довольно полезно для этого.
Найти максимум в массиве:
[3, 5, 4, 3, 6, 2, 3, 4].reduce((a, i) => Math.max(a, i), -Infinity);
Здесь, в каждой итерации мы возвращаем максимум между аккумулятором и текущим элементом, а в конце мы имеем максимум всего массива. Не используйте это, если вы действительно хотите найти максимум в массиве, вы можете использовать:
Math.max(...[3, 5, 4, 3, 6, 2, 3, 4]);
Объединение неровных массивов
let data = [ ["The","red", "horse"], ["Plane","over","the","ocean"], ["Chocolate","ice","cream","is","awesome"], ["this","is","a","long","sentence"] ] let dataConcat = data.map(item=>item.reduce((a,i)=>`${a} ${i}`)) // Result ['The red horse', 'Plane over the ocean', 'Chocolate ice cream is awesome', 'this is a long sentence']
Довольно просто, здесь мы также используем карту, чтобы пройти каждый элемент в массиве, и мы делаем уменьшение со всеми массивами, и мы уменьшаем массив в одну строку.
Удаление дубликатов в массиве:
let dupes = [1,2,3,'a','a','f',3,4,2,'d','d'] let withOutDupes = dupes.reduce((noDupes, curVal) => { if (noDupes.indexOf(curVal) === -1) { noDupes.push(curVal) } return noDupes }, [])
Мы проверяем, есть ли текущее значение индекс на массиве аккумулятора, если не будет возвращаться -1, следовательно, не в массиве, и мы можем добавить его. Вы можете сделать это намного лучше с JavaScript набор По умолчанию он хранит только уникальные значения, но в любом случае, я думаю, что это аккуратный алгоритм, чтобы подумать.
Проверка скобки
[..."(())()(()())"].reduce((a,i)=> i==='('?a+1:a-1,0); //Long way with for loop status=0 for i in string: if(i=="("): status=status+1 elif(i==")"): status=status-1 if(status<0): return False
Это крутой, который я адаптировал из кодирования, который я сделал некоторое время назад. Действительно, мы можем заканчивать петлю раньше, проверяя, если статус меньше 0 в любой точке. Здесь состояние есть, если состояние 0, скобки правильны иначе, есть дисбаланс.
Группа по свойству
let obj = [ {name: 'Alice', job: 'Data Analyst', country: 'AU'}, {name: 'Bob', job: 'Pilot', country: 'US'}, {name: 'Lewis', job: 'Pilot', country: 'US'}, {name: 'Karen', job: 'Software Eng', country: 'CA'}, {name: 'Jona', job: 'Painter', country: 'CA'}, {name: 'Jeremy', job: 'Artist', country: 'SP'}, ] let ppl = obj.reduce((group, curP) => { let newkey = curP['country'] if(!group[newkey]){ group[newkey]=[] } group[newkey].push(curP) return group }, [])
Здесь мы группируем первый массив объектов по ключу кантри, в каждой итерации мы проверяем, существует ли ключ, если не создать массив, то мы добавляем текущий человек к этому, и вернем групповую массив. Вы можете сделать функцию с этим для группировки объектов с указанным ключом.
Сплющенный массив массивов
let flattened = [[3, 4, 5], [2, 5, 3], [4, 5, 6]].reduce( (singleArr, nextArray) => singleArr.concat(nextArray), []) // results is [3, 4, 5, 2, 5, 3, 4, 5, 6]
Это всего лишь 1 уровень глубокой, но он может адаптировать это с рекурсивной функцией, но я не тот фанат, чтобы сделать рекурсивные вещи на JavaScript 😂 Предполагаемый способ сделать это просто для использования метода .flat, он сделает такой же
[ [3, 4, 5], [2, 5, 3], [4, 5, 6] ].flat();
Сила только положительные числа
[-3, 4, 7, 2, 4].reduce((acc, cur) => { if (cur> 0) { let R = cur**2; acc.push(R); } return acc; }, []); // Result [16, 49, 4, 144]
Это похоже на выполнение карты и фильтр одновременно, мы отфильтровали отрицательные числа и поднимаемся положительным.
Обратная строка
const reverseStr = str=>[...str].reduce((a,v)=>v+a)
Это будет работать с любым объектом не только с строками, также обратите внимание, что с этим синтаксисом у нас есть уменьшение в функции, чтобы мы могли назвать REVERSSESTR («HOLA»), и он даст ALOH 😂
Двоичный до десятичности
const bin2dec = str=>[...String(str)].reduce((acc,cur)=>+cur+acc*2,0) // Long format for readability const bin2dec = (str) => { return [...String(str)].reduce((acc,cur)=>{ return +cur+acc*2 },0) }
Чтобы проиллюстрировать этот, позволяет увидеть пример: (10111) -> 1+ (1+ (1+ (0+ (1 + 0 *2)*2)*2)*2)*2 Это немного отличается, чтобы проиллюстрировать, но думать, как если бы первый пробег – это тот, кто находится в середине, и он расширяется наружу от центра.
Я буду признателен, если вы дадите мне следующую, я планирую сделать больше контента здесь, а также если у вас есть время, проверьте мой канал YouTube RamgendePloy Оставьте подпунктивную, если вам нравится там 😄
Вот и все Я надеюсь, что у вас есть лучшее понимание уменьшения сейчас Выберите правильный инструмент для правильной проблемы.
Я надеюсь, что однажды вы можете использовать уменьшить прохладный путь и чувствовать себя хорошо о себе 😂
Благодаря @Jonrandy за последние 2 последних 2
Оригинал: “https://dev.to/ramgendeploy/learn-javascript-reduce-method-with-5-examples-128n”