Skip to content

Create nested array of objects and Group based on 2 column in javascript

I have an array of objects like below.

        var array1 = [
    { col1: 'ABC1+R2', col2: 'ABC', col3: 'R20'},
    { col1: 'ABC1+R3', col2: 'ABC', col3: 'R20'},
    { col1: 'ABC1+R2', col2: 'ABC', col3: 'R301'},
    { col1: 'ABC1+R3', col2: 'ABC', col3: 'R301'},
    { col1: 'CDE2+R4', col2: 'CDE', col3: 'R20'},
    { col1: 'CDE2+R5', col2: 'CDE', col3: 'R30'},
    { col1: 'RED4+R3', col2: 'RED', col3: 'D20'},
    { col1: 'GTR5+R2', col2: 'GTR', col3: 'R20'}];
    
    var result = array1.reduce(function(r, a) {
                r[a.col2] = r[a.col2] || [];
                r[a.col2].push(a);
                return r;
              }, Object.create(null));
              
console.log(result);

I tried the above script, but couldn’t achieve. somewhere i did mistake.

i want the output like below need to group col1 and col3 based on col2. Thanks in advance.

  var res = [  
    {
      "col1": [{text1: "ABC1+R2"},{text1: "ABC1+R"}],
      "col2": "ABC",
      "col3": [{text2: "R20"},{text2: "R301"}],
    }, 
    {
      "col1": [{text1: "CDE2+R4"},{text1: "CDE2+R5"}],
      "col2": "CDE",
      "col3": [{text2: "R20"},{text2: "R30"}],
    }, 
    {
      "col1": "RED4+R5",
      "col2": "RED",
      "col3": "D20"
    },
 
    {
      "col1": "GRT3",
      "col2": "ED",
      "col3": "R20"
    }
  ];
  
  console.log(res);

Answer

Try this one

var array1 = [
  { col1: 'ABC1+R2', col2: 'ABC', col3: 'R20'},
  { col1: 'ABC1+R3', col2: 'ABC', col3: 'R20'},
  { col1: 'ABC1+R2', col2: 'ABC', col3: 'R301'},
  { col1: 'ABC1+R3', col2: 'ABC', col3: 'R301'},
  { col1: 'CDE2+R4', col2: 'CDE', col3: 'R20'},
  { col1: 'CDE2+R5', col2: 'CDE', col3: 'R30'},
  { col1: 'RED4+R3', col2: 'RED', col3: 'D20'},
  { col1: 'GTR5+R2', col2: 'GTR', col3: 'R20'}];
  
var result = array1.reduce(function(r, a) {
  let obj = r.find(el => el.col2 === a.col2);
  const text1 = {"text1": a.col1};
  const text2 = {"text2": a.col3};
  if(obj) {
    if(!obj.col1.find(el => el.text1 === text1.text1)) {
      obj.col1.push(text1);
    }
    if(!obj.col3.find(el => el.text2 === text2.text2)) {
      obj.col3.push(text2);
    }
  } else {
    obj = {
      col1: [text1],
      col2: a.col2,
      col3: [text2]
    }
    r.push(obj)
  }
  return r;
}, []);

console.log(result);