Tengo una matriz de objetos que provienen de una función formData serializeArray. Por ejemplo:
[ 0 : {name: 'animal_monkey', value: 'banana'} 1 : {name: 'animal_horse', value: 'radishes'} 2 : {name: 'fruit_banana', value: 'yellow'} 3 : {name: 'fruit_apple', value: 'red'} ]Estoy buscando una manera de obtener estos diferentes elementos en un solo objeto, dividido por categoría con su valor apropiado asignado, así:
{ animal: { monkey : banana, horse : radishes }, fruit: { banana : yellow, apple : red } }He intentado hacer esto con reducir y asignar objetos, así
obj = keys.map((k, i) => k.reduceRight((value, key) => ({[key]: value}), vals[i]) ) result = Object.assign({}, ...obj)donde claves es una matriz de ['animal_mono', 'animal_caballo', 'fruta_banana', 'fruta_manzana'] y vals es una lista con valores: ['banana', 'rábanos', 'amarillo', 'rojo']. Sin embargo, tal vez como se esperaba, los valores se sobrescriben y termino con:
{ animal: { horse : radishes }, fruit: { apple : red } }Los primeros valores no sobreviven a la asignación. ¿Alguien tiene una buena idea de cómo hacer que esto funcione?
¡Gracias!
Puede dividir cada name en _ y luego crear un objeto con la categoría y el nombre del animal usando array#reduce .
const data = [ {name: 'animal_monkey', value: 'banana'}, {name: 'animal_horse', value: 'radishes'}, {name: 'fruit_banana', value: 'yellow'}, {name: 'fruit_apple', value: 'red'} ], result = data.reduce((r,o) => { const [category, name] = o.name.split('_'); r[category] ??= {}; r[category][name] = o.value; return r; }, {}); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Puede establecer una variable que contendrá el objeto combinado final, luego agregarlo para cada elemento en la matriz usando array.forEach
let single = {}; arr.forEach(obj => { let [catagory, name] = obj.name.split('_'); // catagory = before the _, name = after the _ single[catagory] ??= {}; // make sure the catagory exists as an object in single single[catagory][name] = obj.value; }