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