繁体   English   中英

如何按特定对象键对数组中的值求和?

[英]How to sum values in array by specific object key?

我有一个 js 对象数组,如下所示:

var objArr = [
     {"Country": "US", "City": "MyCity1", "2017-07-12": "1", "2017-07-13": "2"},
     {"Country": "US", "City": "MyCity2", "2017-07-12": "2", "2017-07-13": "2"},
     {"Country": "CN", "City": "MyCity1", "2017-07-12": "5", "2017-07-13": "7"},
     {"Country": "CN", "City": "MyCity2", "2017-07-12": "5", "2017-07-13": "7"}
   ]

我想创建一个新数组,其中国家/地区是唯一的,但日期也应该相加。

{"Country": "US", "2017-07-12":  "3", "2017-07-13": "4"},
{"Country": "CN", "2017-07-12": "10", "2017-07-13": "14"}
            ^^^^                ^^^^                ^^^^   

我很难理解它。 我是否必须先过滤,以某种方式减少它,重新映射它,......我不知道从哪里开始? 任何帮助将不胜感激,谢谢!

使用Array.reduce ,检查当前国家的对象是否存在,如果存在,循环遍历Object.keys更新值,如果不存在,推送一个新的:

编辑:如果你不想要 City 你可以解构它{City, ...curr}

 var objArr = [ { Country: "US", City: "MyCity1", "2017-07-12": "1", "2017-07-13": "2" }, { Country: "US", City: "MyCity2", "2017-07-12": "2", "2017-07-13": "2" }, { Country: "CN", City: "MyCity1", "2017-07-12": "5", "2017-07-13": "7" }, { Country: "CN", City: "MyCity2", "2017-07-12": "5", "2017-07-13": "7" } ]; var result = objArr.reduce((acc, {City, ...curr}) => { const ndx = acc.findIndex(e => e.Country === curr.Country); if (ndx > -1) { const [country, ...keys] = Object.keys(curr); keys.forEach(k => { acc[ndx][k] = +acc[ndx][k] + +curr[k]; }); } else { acc.push(curr); } return acc; }, []); console.log(result);

您可以使用reduce()创建一个对象来对元素进行分组,然后使用Object.values

 var objArr = [ {"Country": "US", "City": "MyCity1", "2017-07-12": "1", "2017-07-13": "2"}, {"Country": "US", "City": "MyCity2", "2017-07-12": "2", "2017-07-13": "2"}, {"Country": "CN", "City": "MyCity1", "2017-07-12": "5", "2017-07-13": "7"}, {"Country": "CN", "City": "MyCity2", "2017-07-12": "5", "2017-07-13": "7"} ] let keys = ["2017-07-12", "2017-07-13"]; const res = Object.values(objArr.reduce((ac, a) => { if(!ac[a.Country]){ ac[a.Country] = {Country: a.Country}; } keys.forEach(k => { ac[a.Country][k] = (ac[a.Country][k] || 0) + Number(a[k]); }) return ac; }, {})) console.log(res)

对数组使用一个forEach并使用forEach遍历每个对象的日期键,并使用唯一键作为Country和累积值构建一个res对象。 使用Object.values of res 从 res 对象获取数组。

更新:修复以确保日期总是一种类型,即number

 var objArr = [ { Country: "US", City: "MyCity1", "2017-07-12": "1", "2017-07-13": "2" }, { Country: "US", City: "MyCity2", "2017-07-12": "2", "2017-07-13": "2" }, { Country: "CN", City: "MyCity1", "2017-07-12": "5", "2017-07-13": "7" }, { Country: "CN", City: "MyCity2", "2017-07-12": "5", "2017-07-13": "7" } ]; const update = data => { const res = {}; data.forEach(({ Country, City, ...dates }) => { const item = res[Country] || { Country }; Object.keys(dates).forEach(date => { item[date] = (item[date] || 0) + Number(dates[date]); }); res[Country] = { ...item }; }); return Object.values(res); }; console.log(update(objArr));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM