Todo desenvolvedor especializado em qualquer linguagem de programação dirá ao senhor que há uma ferramenta poderosa que a linguagem oferece que ele raramente usa e sobre a qual gostaria de saber mais. Para mim, é a Array.prototype.reduce
. Gosto bastante do outro Array
métodos como o map
, filter
, e find
, mas reduce
é um que eu sabia que era poderoso, mas nunca tive muita utilidade para ele.
Foi só quando estava refatorando alguns dos código do depurador do Firefox DevTools que encontrei um ótimo caso de uso para o reduce
— um que pretendo usar no futuro.
Métodos como forEach
e map
foram criados para evitar efeitos colateraise reduce
não é exceção. Nesse caso, no entanto, reduce
pode retornar um Object
que não seja um Array
. Veja este caso, por exemplo:
// Samples sources const sources = [ { id: "server1.conn13.child1/39", url: "https://davidwalsh.name/" }, { id: "server1.conn13.child1/37", url: "https://davidwalsh.name/util.js" } ]; // Return an object of sources with the keys being "id" const sourcesMap = sources.reduce((map, source) => { map[source.id] = source return map; }, {});
No exemplo acima, pegamos uma matriz de Source
e retornamos um único literal de objeto com cada Source
‘s id
como a chave:
{ "server1.conn13.child1/39": { "id": "server1.conn13.child1/39", "url": "https://davidwalsh.name/" }, "server1.conn13.child1/37": { "id": "server1.conn13.child1/37", "url": "https://davidwalsh.name/util.js" } }
Observe que o {}
, que é o último argumento do reduce
, é o objeto inicial/padrão a ser retornado. Se não houver itens na matriz, {}
seria retornado. Observe também que um método de matriz retorna um literal de objeto e não uma matriz modificada!
É uma loucura que eu não tenha usado o reduce
mais, mas essa é a vida em nosso setor: todos nós temos algumas APIs que não usamos muito. Que recurso do JavaScript o senhor tem visto com frequência, mas não tem usado?