分组,求和,并为每个数组生成一个对象 javascript

fer*_*ndo 4 javascript arrays reduce object

我需要这方面的帮助,我需要按 id 和 sum 分组,但我需要为每个结果创建一个新对象

let data =[
    {"id":"2018", "name":"test", "total":1200},
    {"id":"2019", "name":"wath", "total":1500},
    {"id":"2019", "name":"wath", "total":1800},
    {"id":"2020", "name":"zooi", "total":1000},
]
Run Code Online (Sandbox Code Playgroud)

我有这段代码只返回一个带有结果的对象

let result = data.reduce(function (r, o) {
    (r[o.id])?
        r[o.id] += o.total:
        r[o.id] = o.total; 
    return r;
});
Run Code Online (Sandbox Code Playgroud)

但我需要一些这样的

[
    {"id":"2018", "name":"test", "total":1200},
    {"id":"2019", "name":"wath", "total":2300},
    {"id":"2020", "name":"zooi", "total":1000},
]
Run Code Online (Sandbox Code Playgroud)

有什么建议吗,谢谢

Zoh*_*jaz 7

let data =[
    {"id":"2018", "name":"test", "total":1200},
    {"id":"2019", "name":"wath", "total":1500},
    {"id":"2019", "name":"wath", "total":1800},
    {"id":"2020", "name":"zooi", "total":1000},
];

let map = data.reduce((prev, next) =>{
  if (next.id in prev) {
    prev[next.id].total += next.total;
  } else {
     prev[next.id] = next;
  }
  return prev;
}, {});

let result = Object.keys(map).map(id => map[id]);

console.log(result);
Run Code Online (Sandbox Code Playgroud)


Ara*_* Ve 5

你可以试试这个:

const result = Object.values(data.reduce((r, o) => (r[o.id]
  ? (r[o.id].total += o.total)
  : (r[o.id] = {...o}), r), {}));
Run Code Online (Sandbox Code Playgroud)

  • @BreadBoard.ini 它被称为三元运算符。基本上它是一个内联的 if-else 条件。您可以在这里阅读更多相关信息 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator (2认同)