Search code examples
javascriptarraysdata-structuresjavascript-objects

How to merge objects that's inside an array using native javascript


I have an api that gives me the right data, but it's mostly the same data in each object. I want to restructure the objects in the array into one object.

This is the data that my api products currently.

 var data = [
     {maincategory: "AP", maincatname: "Abrasives", subcatname: "Abrasives 
    Accessories"},
     {maincategory: "AP", maincatname: "Abrasives", subcatname: "Non-woven 
     Abrasives"},
     {maincategory: "AP", maincatname: "Abrasives", subcatname: "Bonded 
     Abrasives"},
     {maincategory: "AP", maincatname: "Abrasives", subcatname: "Wire Brushes"},
    {maincategory: "AP", maincatname: "Abrasives", subcatname: "Coated 
    Abrasives"},

{maincategory: "AP", maincatname: "Abrasives", subcatname: "Specialty    
    Abrasives"},
    {maincategory: "AP", maincatname: "Abrasives", subcatname: "Super 
    Abrasives"}
    ];

var transformed= data.map(function(obj){
    var result= {
        key: obj.maincategory,
        values: []
    }
console.log(result)
    for (var key in obj) {
      if (obj.hasOwnProperty(key) && key !== "maincategory") {
          result.values.push([key, obj[key]]);
      }
    }
    return result;
});

console.log(transformed);

This is how I would like the data to be structured.

var data = [
  { 
     maincategory: "AP",
     maincatname: "Abrasives",
     subcatname: ['Abrasives Accessories','Non-woven Abrasives','Bonded Abrasives','Wire Brushes', etc]
  },
];

Solution

  • You can use array#reduce with Object.values(). Create an object lookup with maincategory and add maincategory, maincatname and subcatname corresponding to it and then take out values using Object.values() from this object.

    var data = [ {maincategory: "AP", maincatname: "Abrasives", subcatname: "Abrasives Accessories"}, {maincategory: "AP", maincatname: "Abrasives", subcatname: "Non-woven Abrasives"}, {maincategory: "AP", maincatname: "Abrasives", subcatname: "Bonded Abrasives"},{maincategory: "AP", maincatname: "Abrasives", subcatname: "Wire Brushes"}, {maincategory: "AP", maincatname: "Abrasives", subcatname: "Coated Abrasives"}, {maincategory: "AP", maincatname: "Abrasives", subcatname: "Specialty Abrasives"}, {maincategory:"AP", maincatname: "Abrasives", subcatname: "Super Abrasives"} ]
        result = Object.values(data.reduce((r, {maincategory, maincatname, subcatname}) => {
          r[maincategory] = r[maincategory] || {maincategory, maincatname, subcatname : []};
          r[maincategory].subcatname.push(subcatname);
          return r;
        },{}));
    console.log(result);