Метод уменьшения применяет функцию для каждого элемента массива и накапливает результат, итеративно из отправной точки, затем возвращает одно значение/объект.
Это начальное значение может быть указано или если не уменьшите, будет использовать первый элемент в массиве.
Большинство из этих примеров могут не быть решением для этой проблемы, но идея – проиллюстрировать, как мы можем использовать, чтобы их решить.
Хорошо, давайте начнем с.
Суммирование и умножение:
∑ 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”