展平json使得一个属性是关键而另一个属性

时间:2016-10-03 06:20:31

标签: javascript json

我有以下格式的数据..

var array = [{"name":"abc","boss":"def","sub":[{"schema":"a","data":1},{"schema":"b","data":0},{"schema":"c","data":0}]},
.
.
.
]

我希望将其转换为以下结构:

[{"name":"abc","boss":"def","a":1,"b":0,"c":0},
    .
    .
    .
    ]

基于答案here ..我试过..

grouped = [];
array.forEach(function (a) {
    if (!this[a.name]||!this[a.boss]) {
        this[a.name] = { name: a.name, boss:a.boss };
        grouped.push(this[a.name]);
       }
    this[a.name][a.sub.schema] = (this[a.name][a.sub.schema] || 0) + a.sub.data;
}, Object.create(null));

console.log(grouped);

上面给出了undefined:NaN作为结果对象中的第三个属性..

真心感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:2)

您可能希望reduce sub对象指向该项的属性。

以下代码将array中的项目映射到新数组,其中包含展平的项目:

array = array.map(function(item) {
   item = item.sub.reduce(function(x,y) { return x[y.schema] = y.data, x; }, item);
   delete item.sub;
   return item;
});

答案 1 :(得分:2)

试试这个。

var arr = [];
array.forEach(function(ele){
  var obj = {};obj.name=ele.name;
  obj.boss=ele.boss;
  ele.sub.forEach(function(e){
    obj[e.schema] = e.data
  });
  arr.push(obj)
});