Entender o JavaScript Reduzir Com 5 Exemplos

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.

Share

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *