Tengo una serie de objetos que estoy tratando de convertir en un objeto. Cada objeto tiene un montón de pares k/v, pero el que estoy tratando de desviar se llama key
. Quiero hacer esto con reduce, ya que estoy tratando de familiarizarme más con él, pero no estoy del todo listo con esta implementación.
Simplifiqué mucho mi entrada para este fragmento, pero así es como se ve.
const input = [ {key: "a", value: 1}, {key: "b", value: 2}, {key: "c", value: 3}, {key: "d", value: 4}]; let output = input.reduce((prev, curr) => { let obj = {...prev}; obj[curr.key] = curr; return obj; }); console.log(output);
La salida esperada es
{ "a": { "key": "a", "value": 1 }, "b": { "key": "b", "value": 2 }, "c": { "key": "c", "value": 3 }, "d": { "key": "d", "value": 4 } }
Funciona muy bien para cualquier elemento que comience con el índice 1, pero el primer índice simplemente se extiende al objeto de salida.
Según los documentos de Mozilla:
El reductor recorre la matriz elemento por elemento, agregando en cada paso el valor actual de la matriz al resultado del paso anterior (este resultado es la suma acumulada de todos los pasos anteriores), hasta que no haya más elementos para agregar.
En mi cabeza, interpreté eso y esperaba que prev
comenzara como indefinido y curr
comenzara en el índice 0 y luego iterara a través de cada índice, pero prev
en realidad obtiene el índice 0 al comienzo y curr
comienza en el índice 1.
¿Me estoy perdiendo de algo? ¿Tengo que ejecutar esto por separado solo para el primer índice? Eso parece extraño.
No pasó un valor inicial a .reduce
(que debería ser el segundo argumento pasado), por lo que el valor inicial es el primer elemento de la matriz: {key: "a", value: 1}
.
Si bien podría pasar el objeto vacío como el valor inicial del acumulador:
const input = [ {key: "a", value: 1}, {key: "b", value: 2}, {key: "c", value: 3}, {key: "d", value: 4}]; let output = input.reduce((prev, curr) => { let obj = {...prev}; obj[curr.key] = curr; return obj; }, {}); // ^^ console.log(output);
Esto sería más elegante con Object.fromEntries
:
const input = [ {key: "a", value: 1}, {key: "b", value: 2}, {key: "c", value: 3}, {key: "d", value: 4}]; const output = Object.fromEntries( input.map(obj => [obj.key, obj]) ); console.log(output);