reduce() método de matrizes JavaScript executa um “redutor” função everyelement da matriz em ordem, passando o valor de retorno da anterior reducercall para o próximo redutor de chamada. A função reduce() é uma causa comum de confusão, mas também pode tornar o seu código muito mais legível quando combinado com outras abstrações de programação funcional.,Aqui estão 4 exemplos comuns e 1 Exemplo não-tão-comum que demonstram como usar reduce().
Soma de uma Matriz de Números
Mais reduce() tutoriais de começar com este exemplo: dada uma matriz de números , calcular a soma. Aqui está como você pode resumir um array com um simples id
loop.,
function sum(arr) { let sum = 0; for (const val of arr) { sum += val; } return sum;}sum(); // 16
Aqui está um exemplo equivalente usando reduce():
function sum(arr) { const reducer = (sum, val) => sum + val; const initialValue = 0; return arr.reduce(reducer, initialValue);}sum(); // 16
reduce() função 2 primeiros são os parâmetros de uma função reducer() andan arbitrário initialValue. JavaScript então chama o reducer() em eachelement do array com o valor do acumulador como o primeiro parâmetro.O acumulador começa como initialValue, e então JavaScript usa o valor de retorno de cada reduce() call como o novo acumulador.,
falar é barato, Mostre-me o código. Então, aqui está um exemplo rápido de como você mightimplement simplificado reduce() função for loops.
somar uma matriz de propriedades numéricas
a reduce() função por si só é muitas vezes mais confusa do que útil.Se tudo o que você precisa fazer é somar um array de números, você pode ser betteroff usando um for loop., Mas, quando combinado com outros de matriz de métodos como ofilter() e map()reduce() começa a parecer mais atraente.
por exemplo, suponha que você tem um array de itens de linha, e você quer calcular a soma de cada item de linha total propriedade.
Aqui está uma maneira de adicionar os itens de linha total uso de reduce():
lineItems.reduce((sum, li) => sum + li.total, 0); // 17.5
Isto funciona, mas é menos compostas. Uma melhor alternativa é a primeira map() para obter o total.,
lineItems.map(li => li.total).reduce((sum, val) => sum + val, 0);
Por que esta segunda abordagem é melhor? Porque você pode abstrair o obturador em uma função sum(), e reutilizá-lo onde você precisar para resumir uma matriz.
isto é importante porque, enquanto você pensa que sumReducer() nunca mudará, mudará. Por exemplo, o código acima não conta para o fato de que0.1 + 0.2 !== 0.3 em JavaScript. Este é um erro comum ao calcular os preços numa linguagem interpretada. Pontos binários flutuantes são estranhos.,Então você realmente precisa para completar:
const { round } = require('lodash');function sumReducer(sum, val) { // Round to 2 decimal places. return _.round(sum + val, 2);}
reduce() torna fácil reutilizar a lógica como sumReducer() ao longo de toda a sua appusing função de encadeamento. Então você pode mudar sua lógica uma vez em vez de pesquisar através de cada id
loop em seu aplicativo.
Encontre o valor máximo
por exemplo, suponha que você tem uma lista de datas JavaScript, e você quer encontrar a data mais recente.
const dates = .map(v => new Date(v));
uma abordagem é ordenar a matriz e tomar o último elemento no sortedarray., Isso funciona, mas não é tão eficiente quanto poderia ser, e classificar uma matriz de datas em JavaScript não é trivial.
em vez disso, você pode usar reduce() e fazer o seu redutor retornar a data mais recente encontrada até agora.
o Agrupamento dos Valores
Dado um array de objetos com uma age propriedade:
const characters = ;
Como você devolver um mapa que contém quantos caracteres tem umaage? Por exemplo, a saída correta no array acima seria{ 29: 2, 59: 1 }.,
Aqui está como você pode fazer isso com reduce().
Bônus: promessa de encadeamento
suponha que você tem uma série de funções async que você deseja executar em série.Existe um não-padrão promise.series função para isso, mas você também pode fazer isso comreduce().
movendo-se em
a função reduce() é uma ferramenta poderosa. Abstraindo filtrantes e redutores, você pode consolidar tarefas comuns como”somar um array de números” em uma função separada para facilitar o refactoring e o código DRY-er.