首页 > 解决方案 > 如何在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 进行一些处理,但我不知道如何实现这一点。

标签: javascriptobjectmomentjs

解决方案


您可以使用reduceforEachObject.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);

推荐阅读