javascript - 使用 .reduce 对每个名称求和
问题描述
我有一个像这样的对象数组:
var array = [{name: "john", points: 20},
{name: "jack", points: 12},
{name: "john", points: 10},
{name: "jack", points: 2},
{name: "bill", points: 4}]
从这个数组中,我想生成一个新数组,其中包含每个名称的点的总和,通常如下所示:
var newArray = [{name: "john", points:30},
{name: "jack", points:14},
{name: "bill", points:4}]
我编写了以下运行良好的函数。
function filterArray(array){
var newArray=[]
for (i in array){
var index=newArray.map(x=>x.name).indexOf(array[i].name)
if (index==-1){
newArray.push(array[i])
}
else{
newArray[index].points+=array[i].points
}
}
return newArray;
}
但是,我想使用一些可能更优雅的东西,比如 .reduce() 函数。有人知道怎么做吗?
解决方案
您可以使用reduce
分组功能Object.values
和提取值的功能。
let array = [{name: "john", points: 20},{name: "jack", points: 12},{name: "john", points: 10},{name: "jack", points: 2},{name: "bill", points: 4}],
result = Object.values(array.reduce((a, {name, points}) => {
(a[name] || (a[name] = {name, points: 0})).points += points;
return a;
}, Object.create(null)));
console.log(result);
.as-console-wrapper { min-height: 100%; }
推荐阅读
- javascript - 如何在 Thymeleaf @{...} 链接表达式中获取 Javascript 函数返回
- sonos - 如何从 Sonos 中删除音频剪辑
- python - PanclusGz 没有属性 date_solareclipse
- regex - 正则表达式获取带有破折号和正斜杠的 URL 的文件名
- express - 无法推送元素类型 ObjectId 的猫鼬数组
- c - c语言的函数定积分
- c - freeglut (./a.out): 错误: 没有为窗口 1 注册显示回调
- visual-studio - 没有办法解决之间的冲突 - 警告
- angular - 在 VSCode 中调试 Angular 应用程序再次无法正常工作
- flutter - 因为sdk的flutter_driver每个版本都依赖crypto 2.1.5,Cruise依赖crypto 3.0.0,所以sdk的flutter_driver是被禁止的