Tengo este JSON y necesito agrupar en un nuevo objeto por clave:
[ { "product": "name 1", "price": "3000", "inspection": false, }, { "product": "name 2", "price": "1000", "inspection": true, }, { "product": "name 3", "price": "5000", "inspection": false, }, ]Resultado Final Esperado:
{ "product": ["name 1", "name 2", "name 3"], "price": ["3000", "1000", "5000"], "inspection": [false, true, false] }Intenté usar -> for, foreach <- pero no obtuve un resultado bueno/óptimo. También consideré usar reduce pero no pude hacerlo funcionar.
let data = [ { "product": "name 1", "price": "3000", "inspection": false, }, { "product": "name 2", "price": "1000", "inspection": true, }, { "product": "name 3", "price": "5000", "inspection": false, }, ]; let output = Object.fromEntries( Object.keys(data[0]).map(k => [k, data.map(d => d[k])] ) ); console.log(output);Para objetos de cualquier forma, esto agrupará los elementos bajo cualquier clave:
const arr = [ { product: "name 1", price: 3000, inspection: false }, { product: "name 2", price: 1000, inspection: true }, { product: "name 3", price: 5000, inspection: false }, ] const groups = arr.reduce((groups, obj) => Object.entries(obj).reduce((groups, [key, val]) => ( { ...groups, [key]: (groups[key]??[]).concat(val) } ), groups) , {}) console.log(groups) Las claves que se agrupan se pueden cambiar filtrando el resultado de Object.entries(obj) por clave.
A continuación se presenta una posible forma de lograr el objetivo deseado.
Fragmento de código
// one possible method to transform given array const myTransform = arr => ( arr.reduce( (acc, { product, price, inspection }) => ( (acc.product ??= []).push(product), (acc.price ??= []).push(name), (acc.inspection ??= []).push(inspection), acc ), {} ) ); // using a simple for loop: const myTransform2 = arr => { // initialize result "res" as empty object const res = {}; // iterate over each elt in array "arr" for ({ product, price, inspection } of arr) { // if res has no key product, add one with value as empty array // push the "product" to the above key (res.product ??= []).push(product); // same logic for price (res.price ??= []).push(name); // same for inspection (res.inspection ??= []).push(inspection); }; // return the result return res; }; const dataArr = [{ "product": "name 1", "price": "3000", "inspection": false, }, { "product": "name 2", "price": "1000", "inspection": true, }, { "product": "name 3", "price": "5000", "inspection": false, }, ]; console.log( 'transformed array:\n', myTransform(dataArr) ); console.log( 'transformed array using for loop:\n', myTransform2(dataArr) ); .as-console-wrapper { max-height: 100% !important; top: 0 }Explicación
Comentarios agregados al fragmento anterior.