转换对象数组的结构

Transform structure of array of objects

本文关键字:结构 数组 对象 转换      更新时间:2023-09-26

我有类似-的数据

var data = [{"DefaultZone":[{"key":"stream0","value":100},
                        {"key":"stream1","value":50},
                        {"key":"stream2","value":10}
                       ]},
        {"Zone 1":[{"key":"stream0","value":120},
                  {"key":"stream1","value":55},
                  {"key":"stream2","value":15}
                  ]}
       ]        

并想像一样改造它

var data = [{"key": "stream0", "values":[{"x":"DefaultZone","y":100}, {"x":"Zone 1","y":120}]},
    {"key": "stream1", "values":[{"x":"DefaultZone","y":50}, {"x":"Zone 1","y":55}]},
    {"key": "stream2", "values":[{"x":"DefaultZone","y":10}, {"x":"Zone 1","y":15}]}
   ];

使用JavaScript(ES6(。如有任何帮助,我们将不胜感激。。

这是我想到的第一种方法:

var data = [{
  "DefaultZone": [
    { "key": "stream0", "value": 100 },
    { "key": "stream1", "value": 50 },
    { "key": "stream2", "value": 10 }]
}, { 
  "Zone 1": [
    { "key": "stream0", "value": 120 },
    { "key": "stream1", "value": 55 },
    { "key": "stream2", "value": 15 }]
}];
let working = data.reduce((p, c) => {
  let x = Object.keys(c)[0];
  c[x].forEach(v => {
    if (!p[v.key]) p[v.key] = [];
    p[v.key].push({ x: x, y: v.value });
  });
  return p;
}, {});
let output = Object.keys(working).map(v => ({ key: v, values: working[v] }));
console.log(output);

进一步阅读:

  • 阵列CCD_ 1方法
  • Object.keys()方法
  • 阵列.forEach()方法
  • 阵列.map()方法

虽然我喜欢nnnnnn的答案,但这里是另一个答案,只使用Object.keys((方法:

var data = [{
    "DefaultZone": [{
        "key": "stream0",
        "value": 100
    }, {
        "key": "stream1",
        "value": 50
    }, {
        "key": "stream2",
        "value": 10
    }]
}, {
    "Zone 1": [{
        "key": "stream0",
        "value": 120
    }, {
        "key": "stream1",
        "value": 55
    }, {
        "key": "stream2",
        "value": 15
    }]
}]
final = {}
data.forEach(function(x) {
    Object.keys(x).forEach(function(y) {
        x[y].forEach(function(z) {
            if (!final[z['key']]) final[z['key']] = [];
            final[z['key']].push({
                'x': y,
                'y': z['value']
            })
        })
    })
})
answer = []
Object.keys(final).forEach(function(x) {
    answer.push({
        'key': x,
        values: final[x]
    })
})
console.log(answer)