Estoy buscando tomar una matriz de objetos y convertirla en una matriz de subarreglos en función de una propiedad de objeto elegida
por ejemplo:
[ {foo: 1, bar: a}, {foo: 2, bar: b}, {foo: 1, bar: c}, {foo: 2, bar: d} ]Crear subarreglos con la propiedad foo se convertiría en:
[ [ {foo: 1, bar: a}, {foo: 1, bar: c}, ], [ {foo: 2, bar: b}, {foo: 2, bar: d} ] ]No puedo pensar en una manera eficiente para esto. Sigo recurriendo a la creación de un conjunto de todos los valores de propiedad únicos de mi valor elegido, y luego la fuerza bruta varias veces.
const distinctProperties = [...new Set(originalArray.map(item => item.foo))] const newArray = distinctProperties.map(item => originalArray.filter(obj => obj.foo === item))Gracias de antemano por algunos consejos aquí!
se puede hacer con reduce . puede ajustar esto alrededor de otra función para agrupar por la clave que desee.
Aquí estoy agrupando según el valor de foo y res será así
{ 1: [{ bar: "a", foo: 1 }, { bar: "c", foo: 1 }], 2: [{ bar: "b", foo: 2 }, { bar: "d", foo: 2 }] } luego estoy tomando Object.values de esto para obtener el formato de matriz que desea
let a =[ {foo: 1, bar: 'a'}, {foo: 2, bar: 'b'}, {foo: 1, bar: 'c'}, {foo: 2, bar: 'd'} ] let res= Object.values(a.reduce((acc,curr)=> { if(!acc[curr.foo])acc[curr.foo]=[]; acc[curr.foo].push(curr) return acc; },{})) console.log(res)Como una función generalizada para tomar el nombre de la clave como entrada
let a =[ {foo: 1, bar: 'a'}, {foo: 2, bar: 'b'}, {foo: 1, bar: 'c'}, {foo: 2, bar: 'd'} ] let groupByValue = (arr,key) => { return Object.values(arr.reduce((acc,curr)=> { if(!acc[curr[key]])acc[curr[key]]=[]; acc[curr[key]].push(curr) return acc; },{})) } let res1 = groupByValue(a,'foo') let res2 = groupByValue(a,'bar') console.log(res1) console.log(res2)