javascript - 如何在javascript中以日期为键聚合对象
问题描述
我有一个对象,其键为以下格式的日期"yyyy-mm-dd"
(例如:2020-08-14),每个键的值是具有两个属性(名称和值)的对象数组。
我需要找到一种方法来获取按天数value
分组的密钥name
总和N
。
这是一个更好理解的示例,原始对象有 4 天的数据,其中一天有一个空数组:
{
"2020-10-15":[
{"name":"France","value":20},
{"name":"United States","value":20},
{"name":"Italy","value":5},
],
"2020-10-16":[
{"name":"Germany","value":10},
{"name":"United States","value":5},
{"name":"France","value":10}
],
"2020-10-17":[],
"2020-10-18":[
{"name":"UK","value":10},
{"name":"Italy","value":10},
]
}
例如,如果我们希望将此数据按 4 天分组,我们将得到以下结果:
[{"name": "France", "value": 30},
{"name": "United States", "value": 25},
{"name": "Italy", "value": 15},
{"name": "Germany", "value": 10},
{"name": "UK", "value": 10}]
这是 4 天内具有相同名称值的所有对象的总和。我完全不知道如何实现这一点,我知道可以使用 map 来迭代对象键并通过时刻 js 进行一些处理,但我不知道如何实现这一点。
解决方案
您可以使用reduce、forEach和Object.keys方法执行以下操作,
const value = {
"2020-10-15":[
{"name":"France","value":20},
{"name":"United States","value":20},
{"name":"Italy","value":5},
],
"2020-10-16":[
{"name":"Germany","value":10},
{"name":"United States","value":5},
{"name":"France","value":10}
],
"2020-10-17":[],
"2020-10-18":[
{"name":"UK","value":10},
{"name":"Italy","value":10},
]
}
let res = Object.keys(value).reduce((prev, curr) => {
value[curr].forEach(item => {
const idx = prev.findIndex(pItem => pItem.name === item.name);
if(idx > -1) {
const newObj = {...prev[idx], value: prev[idx].value + item.value};
prev[idx] = newObj;
return ;
}
prev.push(item);
})
return prev;
}, []);
console.log(res);
推荐阅读
- regex - 从 tr 标签内返回元素列表
- python-3.x - 清理 DataFrame 中的数据
- reactjs - 如何追踪:必须返回一个有效的 React 元素(或 null)
- ssl - GCE 上的自签名 SSL 证书——“无法解析 SSL 证书”
- c# - 如何加入滑动窗口
- php - 如何使用 URL 查询字符串在同一页面中显示不同的内容?
- ios - 什么是 iOS 相当于 WPF 的 Grid 与星大小?
- matlab - 如何在 MATLAB 中将轴限制全局设置为绘制数据的最小值和最大值?
- javascript - Javascript:向登录 api 发送 ajax 请求——在哪里保存令牌?
- c++ - 变体访问重载技巧在 gcc 中不起作用