Javascript 计算JSON数组中的值之和

Javascript 计算JSON数组中的值之和,javascript,ecmascript-6,Javascript,Ecmascript 6,具有如下数组: const数据=[ { “姓名”:“戴夫”, “硬币”:14, "武器":二,, “其他项目”:3, “颜色”:“红色” }, { “姓名”:“Vanessa”, “硬币”:18, "武器":一,, “其他项目”:5, “颜色”:“蓝色” }, { “姓名”:“沙龙”, “硬币”:9, “武器”:5, “其他项目”:1, “颜色”:“粉红色” }, { “姓名”:“沃尔特”, “硬币”:9, "武器":二,, “其他项目”:4, “颜色”:“白色” } ] 如何使用ES6功能计

具有如下数组:

const数据=[
{
“姓名”:“戴夫”,
“硬币”:14,
"武器":二,,
“其他项目”:3,
“颜色”:“红色”
},
{
“姓名”:“Vanessa”,
“硬币”:18,
"武器":一,,
“其他项目”:5,
“颜色”:“蓝色”
},
{
“姓名”:“沙龙”,
“硬币”:9,
“武器”:5,
“其他项目”:1,
“颜色”:“粉红色”
},
{
“姓名”:“沃尔特”,
“硬币”:9,
"武器":二,,
“其他项目”:4,
“颜色”:“白色”
}
]
如何使用ES6功能计算
硬币
武器
其他物品
的总和?(我不喜欢这个:任何简单的方法都是好的。)


data.reduce((first,last)=>first+last)
生成一个
[object object][object object]
s的链。

您必须单独处理每个字段(请注意,当您没有为其指定第二个参数时,它将以第一个数组对象作为种子,并从第二个开始处理):

const数据=[
{
“姓名”:“戴夫”,
“硬币”:14,
"武器":二,,
“其他项目”:3,
“颜色”:“红色”
},
{
“姓名”:“Vanessa”,
“硬币”:18,
"武器":一,,
“其他项目”:5,
“颜色”:“蓝色”
},
{
“姓名”:“沙龙”,
“硬币”:9,
“武器”:5,
“其他项目”:1,
“颜色”:“粉红色”
},
{
“姓名”:“沃尔特”,
“硬币”:9,
"武器":二,,
“其他项目”:4,
“颜色”:“白色”
}
]
让result=data.reduce((a,c)=>({
硬币:a.硬币+c.硬币,
武器:a.武器+c.武器,
其他项目:a.otherItems+c.otherItems})
)

控制台日志(结果)
您的想法是正确的,您需要使用
reduce
方法。问题是你在求两个对象的和,而不是它们的属性。您只需将代码更改为以下内容(对硬币求和):

data.reduce((first,last)=>first.coins+last.coins,0)
以下是武器:

data.reduce((first,last)=>first.wearms+last.wearms,0)

您可以使用
数组.prototype.reduce

要使其更灵活、更动态,请对要计数的键进行
设置

然后检查
集合
中的每个键,如果该键位于
obj
中,则在reduce回调中的
累加器
对象中汇总:

const data=[{“name”:“Dave”,“coins”:14,“武器”:2,“otherItems”:3,“color”:“red”},{“name”:“vanesa”,“coins”:18,“武器”:1,“otherItems”:5,“color”:“blue”},{“name”:“Sharon”,“coins”:9,“武器”:5,“otherItems”:1,“color”:“pink”},{“name”:“Walter”,“coins”:9,“武器”:2,“otherItems”:4,“color”:“white”}]
//计数键
常数键=新的一套([“硬币”,“武器”,“其他物品]);
常数计数=数据减少((acc,obj)=>{
const objKeys=keys.forEach(key=>{
if(对象hasOwnProperty(键)){
acc[键]=(acc[键]| | 0)+obj[键];
}
});
返回acc;
}, {});

控制台日志(计数)您可以获取求和所需的键数组,并为求和创建对象,然后添加所需的值

const
数据=[{姓名:“戴夫”,硬币:14枚,武器:2枚,其他物品:3枚,颜色:“红色”},{姓名:“瓦内萨”,硬币:18枚,武器:1枚,其他物品:5枚,颜色:“蓝色”},{姓名:“沙龙”,硬币:9枚,武器:5枚,其他物品:1枚,颜色:“粉色”},{姓名:“沃尔特”,硬币:9枚,武器:2枚,其他物品:4枚,颜色:“白色”},
钥匙=[‘硬币’、‘武器’、‘其他物品’],
sums=data.reduce(
(r,o)=>(keys.forEach(k=>r[k]+=o[k]),r),
Object.fromEntries(keys.map(k=>[k,0]))
);

控制台日志(总和)你想数什么?你有一个结果的例子吗?所有的可计算值:-)正如我写的,
硬币
武器
其他物品
。不幸的是,这会导致
NaN
@mickl的答案似乎是正确的。我忘记了初始值,现在编辑了答案,所以它应该仍然工作
NaN
在这里。。。累加器(
first
)不应该引用任何键:这将起作用:
data.reduce((first,last)=>first+last.coins,0)
。要覆盖数组中单个对象的情况,需要提供初始值
reduce((a,c)=>{…},{coins:0,武器:0,其他物品:0})