合并并添加数组中的记录

时间:2019-03-28 16:04:25

标签: javascript

假设我们有以下数组。

[{ "id": "a01", "key": "k01", "value" : 100},
{ "id": "a02", "key": "k02", "value" : 320},
{ "id": "a02", "key": "k02", "value" : 20},
{ "id": "a02", "key": "k02", "value" : 220},
{ "id": "a03", "key": "k01", "value" : 120},
{ "id": "a03", "key": "k01",  "value" : 120},
{ "id": "a03", "key": "k03",  "value" : 300}]

我想如下创建新数组。

[{ "id": "a01", "key": "k01", "value" : 100},
{ "id": "a02", "key": "k02", "value" : 560},
{ "id": "a03", "key": "k01", "value" : 240},
{ "id": "a03", "key": "k03",  "value" : 300}]

我想合并记录并添加具有相同ID和键的值。 发生情况可能有所不同。 实现这一目标的最简单方法是什么?

我尝试在for循环中使用.filter提取具有相同ID和键的记录, 能够合计结果然后将其推入新数组,但是我无法跳过其他记录。 有没有办法在循环中跳过记录? (例如,类似i + filteredArr.length而不是i ++的循环计数器)

1 个答案:

答案 0 :(得分:1)

let x = [
{ "id": "a01", "key": "k01", "value" : 100},
{ "id": "a02", "key": "k02", "value" : 320},
{ "id": "a02", "key": "k02", "value" : 20},
{ "id": "a02", "key": "k02", "value" : 220},
{ "id": "a03", "key": "k01", "value" : 120},
{ "id": "a03", "key": "k01",  "value" : 120},
{ "id": "a03", "key": "k03",  "value" : 300}
]

let y = {};
x.forEach((val)=> {
  if(y[val.id + '_' + val.key]) {
    y[val.id + '_' + val.key].value = y[val.id + '_' + val.key].value + val.value;
  }
  else {
    y[val.id + '_' + val.key] = {
      "value": val.value
    }
  }
})

let arr = [];
for(key in y) {
  let id_key = key.split("_")
  arr.push({
    id: id_key[0],
    key: id_key[1],
    value: y[key].value
  });
  
}

console.log(arr);