简体   繁体   English

如何使用本机JavaScript合并数组中的对象

[英]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. 我有一个API,可以为我提供正确的数据,但是每个对象中的数据几乎都是相同的。 I want to restructure the objects in the array into one object. 我想将数组中的对象重组为一个对象。

This is the data that my api products currently. 这是我的api产品当前的数据。

 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]
  },
];

You can use array#reduce with Object.values() . 您可以将array#reduceObject.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. 使用maincategory创建一个对象查找,并添加maincategory对应的maincategorymaincatnamesubcatname ,然后使用Object.values()从该对象中取出值。

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

If you are sure that it's always the same data then you can have your result by using this function: 如果确定数据始终相同,则可以使用以下函数获得结果:

function transform(data){
  obj = {};
  obj['maincategory'] = data[0]['maincategory'];
  obj['maincatname'] = data[0]['maincatname'];
  obj['subcatnames'] = data.map(function(obj){ 
                       return obj.subcatname});
  return [obj]
}

To be honest the best solution is to fix the api to return a more structured results. 老实说,最好的解决方案是修复api以返回更结构化的结果。

You can simply use Array.reduce to get that output: 您可以简单地使用Array.reduce获得该输出:

 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" }] const r = data.reduce((r,c) => (r.subcatname = [...Array.isArray(r.subcatname) ? r.subcatname : [r.subcatname], c.subcatname], r)) console.log(r) 

The idea is since you only need the subcatname to be combined you can just use the Array.reduce and its basic form where it essentially acts as a merge . 这个想法是因为您只需subcatname组合在一起,就可以使用Array.reduce及其基本形式(实际上它充当merge

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM