Estoy fusionando dos objetos para crear un objeto de filtro. Sin embargo, quiero agrupar los valores de propiedad de los objetos fusionados donde las claves son las mismas.
Asi que...
[{category: 'furniture'}, {category: 'mirrors'}, {availability: 'in_stock'}]se convierte
[{category: ['furniture', 'mirrors']}, {availability: 'in_stock'}]¿algunas ideas?
Con lodash, fusiona toda la matriz en un nuevo objeto extendiéndose en _.mergeWith() . El personalizador debe usar matrices vacías como valores predeterminados para los valores actuales y concatenar los valores. Use _.map() para volver a convertir a una matriz.
const data = [{category: 'furniture'}, {category: 'mirrors'}, {availability: 'in_stock'}]; const result = _.map( _.mergeWith({}, ...data, (a = [], b = [], key) => a.concat(b)), (val, key) => ({ [key]: val }) ) console.log(result) <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> Usando Vanilla JS, reduzca la matriz a un Mapa usando las claves de los objetos como las claves del Mapa, con una matriz vacía como valor, e inserte los valores de los objetos en las matrices. Use Array.from() para convertir el mapa en una matriz.
const data = [{category: 'furniture'}, {category: 'mirrors'}, {availability: 'in_stock'}]; const result = Array.from( data.reduce((acc, obj) => { Object.entries(obj) .forEach(([key, val]) => { if(!acc.has(key)) acc.set(key, []) acc.get(key).push(val) }) return acc }, new Map()), ([key, val]) => ({ [key]: val }) ) console.log(result)Puedes usar reduce así:
const data = [ { category: 'furniture' }, { category: 'mirrors' }, { availability: 'in_stock' } ]; const result = data.reduce( (a, x) => { const key = Object.keys(x)[0]; // find the key of the current object if (!a.tmp[key]) { // if the current key doesn't exist in the lookup object (tmp) yet ... a.tmp[key] = []; // create an empty array in the lookup object for the current key a.result.push({ [key]: a.tmp[key] }); // push the current object to the result } a.tmp[key].push(x[key]); // push the current value to the array return a; }, { result: [], tmp: {} }, ).result; console.log(result);Estoy seguro de que hay formas más fáciles de lograr esto, pero eso es lo mejor que se me ocurre en este momento.
también podemos lograr esto usando forEach loop :
const input = [{category: 'furniture'}, {category: 'mirrors'}, {availability: 'in_stock'}]; const resultObj = {}; const resultArr = []; input.forEach((obj) => { resultObj[Object.keys(obj)[0]] = []; }) input.forEach((obj) => { resultObj[Object.keys(obj)[0]].push(obj[Object.keys(obj)[0]]); resultArr.push(resultObj); }) console.log([...new Set(resultArr)]);