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?