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

Time:01-17

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);

CodePudding user response:

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);

CodePudding user response:

You could either chgeck the object if the key exist, then add a single object otherwise check if one of the properties is not an array as value, then convert the plain value to an object inside of an array.

const
    data = [{ 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'}],
    result = Object.values(data.reduce(function(r, { col1, col2, col3 }) {
        if (r[col2]) {
            if (!Array.isArray(r[col2].col1)) {
                r[col2].col1 = [{ text1: r[col2].col1 }];
                r[col2].col3 = [{ text2: r[col2].col3 }];
            }
            r[col2].col1.push({ text1: col1 });
            r[col2].col3.push({ text2: col3 });
        } else {
            r[col2] = { col1, col2, col3 };
        }
        return r;
    }, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

CodePudding user response:

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));
let arr = []

for(let k in result){
  let col1 = result[k].length > 1 ? result[k].map(el => ({text: el.col1})) : result[k][0]['col1'];
  let col2 = k;
  let col3 = result[k].length > 1 ? result[k].map(el => ({text: el.col3})) : result[k][0]['col1'];
  arr.push({col1, col2, col3})
 }

 console.log(arr);
  •  Tags:  
  • Related