-7

I'm trying to group an array of objects in array of arrays by 'group' key in objects.

Current array:

array =
[
    [{name:’a’,age:’4’,group:’15’},{name:’b’,age:’4’,group:’15’}, 
     {name:’c’,age:’4’,group:’15’}],
    [{name:’aa’,age:’6’,group:’12’},{name:’bb’,age:’6’,group:’12’}],
    [{name:’d’,age:’5’,group:’15’},{name:’e’,age:’5’,group:’15’}, 
     {name:’f’,age:’5’,group:’15’}],
    [{name:’dd’,age:’7’,group:’12’}, 
     {name:’ee’,age:’7’,group:’12’{name:’ff’,age:’7’,group:’12’}]
]

I want to get an array looking like:

newArray=  [
        {15:[[{name:’a’,age:’4’,group:’15’},{name:’b’,age:’4’,group:’15’}, 
              {name:’c’,age:’4’,group:’15’}],[{name:’d’,age:’5’,group:’15’}, 
              {name:’e’,age:’5’,group:’15’},{name:’f’,age:’5’,group:’15’}]
        },
        {12:[[{name:’aa’,age:’6’,group:’12’},{name:’bb’,age:’6’,group:’12’}],
            [{name:’dd’,age:’7’,group:’12’},{name:’ee’,age:’7’,group:’12’}, 
             {name:’ff’,age:’7’,group:’12’}]]
        }
    ]

Thank you!

user12083483
  • 77
  • 1
  • 2
  • 7

2 Answers2

0

You can do something like this using Reduce:

array =
[
    [{name:'a',age:'4',group:'15'},
     {name:'b',age:'9',group:'15'}, 
     {name:'c',age:'6',group:'15'},
     {name:'c',age:'8',group:'15'},
     {name:'c',age:'4',group:'15'}],
    [{name:'aa',age:'6',group:'12'}]
];
const groupByAge = (acc, elem)=>{
    acc[elem.age] = acc[elem.age]?  [...acc[elem.age],elem] : [elem];
    return acc
}
var res = array.reduce((acc, elem)=>{
var key = "";
  elem.forEach(k=> {
       key  = k.group;
       acc[k.group] = acc[k.group] ?  [...acc[k.group], k] : [k];
   });
  var temp= acc[key].reduce(groupByAge, {});
  acc[key] = Object.values(temp);
  return acc
},{});

console.log([res])
ABGR
  • 4,631
  • 4
  • 27
  • 49
0

flat to flatten the arrays.
Create object maps to group by group and age.
Extract individual objects per key in object map, and unwrap ages objects to arrays.
ages are numbers, and ES2015 sorts integer indexes, so the order is already sorted by age.

Note: your JavaScript data object is invalid JavaScript due to use of non-standard single quote. And there are unclosed brackets in your data. Parsed as string sanitized to JSON.

res = 
Object.entries(
array.flat().reduce((res,x)=>{
  const {age, group} = x
  res[group] = res[group] || {}
  res[group][age] = res[group][age] || []
  res[group][age].push(x)
  return res
},{})
).map(([k,v])=>({[k]: Object.values(v)}))

console.log(res)
<script>
array =
JSON.parse(`[
    [{name:’a’,age:’4’,group:’15’},{name:’b’,age:’4’,group:’15’}, 
     {name:’c’,age:’4’,group:’15’}],
    [{name:’aa’,age:’6’,group:’12’},{name:’bb’,age:’6’,group:’12’}],
    [{name:’d’,age:’5’,group:’15’},{name:’e’,age:’5’,group:’15’}, 
     {name:’f’,age:’5’,group:’15’}],
    [{name:’dd’,age:’7’,group:’12’}, 
     {name:’ee’,age:’7’,group:’12’},{name:’ff’,age:’7’,group:’12’}]
]`.replace(/’/g,'"').replace(/(name|age|group)/g,'"$1"'))
</script>
user120242
  • 14,918
  • 3
  • 38
  • 52