根据不同的ID转换数组

时间:2019-05-12 18:13:42

标签: javascript arrays

我有一个像这样的数组

Result=[{ 'Sum': 4580,'class': '01','pID': 1},
 { 'Sum': 580, 'class': '01','pID': 2},
 { 'Sum': 1280,'class': '01','pID': 3},
 { 'Sum': 5580,'class': '02','pID': 1},
 { 'Sum': 280, 'class': '02','pID': 2},
 { 'Sum': 380,'class': '02','pID': 3}]

我正在尝试将此数组转换为

[{'class':'01','pID1':4580,'pID2':580,'pID3':1280},
 {'class':'02','pID1':5580,'pID2':280,'pID3':380}]

3 个答案:

答案 0 :(得分:1)

您可以采用Map来缩小数组,并收集总和并仅返回值。

createHeader(&header);
if (header == NULL)
    exit(-1);
(gdb) bt -10

答案 1 :(得分:0)

您可以使用reduce创建一个以每个class作为键的累加器对象。如果尚未添加当前的class,请使用当前的class值创建密钥。否则,添加一个新密钥"pID" +当前密钥pID,其值设置为当前密钥Sum。然后使用Object.values()以数组的形式获取merged对象的值

const input = [{ 'Sum': 4580,'class': '01','pID': 1},
 { 'Sum': 580, 'class': '01','pID': 2},
 { 'Sum': 1280,'class': '01','pID': 3},
 { 'Sum': 5580,'class': '02','pID': 1},
 { 'Sum': 280, 'class': '02','pID': 2},
 { 'Sum': 380,'class': '02','pID': 3}]
 
const merged = input.reduce((acc, { Sum, class:c, pID }) => {
  acc[c] = acc[c] || { class: c }
  acc[c]["pID" + pID] = Sum;
  return acc;
}, {})

console.log(Object.values(merged))

这是accumulator / merged对象的样子:

{
  "01": {
    "class": "01",
    "pID1": 4580,
    "pID2": 580,
    "pID3": 1280
  },
  "02": {
    "class": "02",
    "pID1": 5580,
    "pID2": 280,
    "pID3": 380
  }
}

答案 2 :(得分:0)

以下功能将为您进行转换。

transform(Result);这样输入数据

function transform(result) {
   const map = {};

   result.forEach(data => {
     if (!map[data.class]) {
       map[data.class] = { 'class': data.class };
     }

     map[data.class]['pID' + data.pID] = data.Sum;
   });

   return Object.keys(map).map(key => map[key]); // return Object.values(map);

 }