Как объединить объекты, которые находятся внутри массива, используя нативный JavaScript - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть API, который дает мне правильные данные, но в большинстве случаев это одни и те же данные в каждом объекте.Я хочу реструктурировать объекты в массиве в один объект.

Это данные, которые в настоящее время используются в моих продуктах 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);

Именно так я хотел бы структурировать данные.

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

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Если вы уверены, что это всегда одни и те же данные, то вы можете получить свой результат, используя эту функцию:

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

Если честно, лучшее решение - это исправить api, чтобы вернуть большеструктурированные результаты.

0 голосов
/ 21 ноября 2018

Вы можете просто использовать 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)

Идея состоит в том, что, поскольку вам нужно только объединить subcatname, вы можете просто использовать Array.reduce и его базовую форму, где он по существу действует как merge.

0 голосов
/ 21 ноября 2018

Вы можете использовать array#reduce с Object.values().Создайте поиск объекта с maincategory и добавьте maincategory, maincatname и subcatname, соответствующие ему, а затем извлеките значения, используя 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);
...