Estou declarando o seguinte array.
let arr = [
{ id:"aa", vals:[1,2,3] },
{ id:"cc", vals:[3,4,5] },
{ id:"bb", vals:[2,3,4] }];
Imprimi-lo no console confirma a expectativa, pois cada elemento possui dois campos: uma string id
e um array numérico vals
. Então, eu atuo reduce(...)
assim.
let reduction = arr.reduce((a,b) => a[b.id] = b, {});
Minha expectativa é um único objeto com os campos correspondentes aos valores de ID do array iterado, ou seja, aa , bb e cc , onde cada um desses três campos contém o elemento correspondente do array original.
O que obtenho é apenas o último elemento que segue a expectativa, enquanto os dois primeiros ficam complicados de alguma forma, sendo equipados com campos adicionais. Observe que estou falando sobre mudanças no array original! De acordo com a documentação : O método reduz() não altera o array original .
o que estou perdendo?
O desejo final do jogo é simplesmente converter um array em um dicionário, reduzindo-o a uma única instância, mas com campos adicionados arbitrariamente. Existem vários recursos para se inspirar por aí. Portanto, esta questão refere-se apenas a este comportamento inesperado.
Matrizes em JavaScript são objetos e todos os objetos em JavaScript são passados por referência. Em outras palavras, sempre que você alterar qualquer propriedade do seu objeto, todas as suas referências apontarão para o mesmo objeto, com a propriedade alterada.
No seu caso, você pode considerar retornar um novo objeto a cada vez, assim: