使用相同的键汇总对象值

时间:2018-05-26 16:17:51

标签: javascript arrays

我是javascript的新手,今天我遇到了问题。事实是,每天每小时都有一大群人参观(如你所见)。我想找出一天中最热门的时段。我的计划是创建一个地图,其中key是小时索引(0,1,2,3,4,5 ......),value是在该小时的所有日期访问过的所有人的总和。问题是我无法用我的JS知识做到这一点。有人可以给我一个方向来解决这个问题吗?非常感谢你。

[
   {date: "25.05.2018",
     value: {
       1: 209
       2: 123
       3: 890
       .
       .
       24: 789
     }
    }, 
    {date: "26.05.2018",
     value: {
       1: 280
       2: 398
       3: 450
       .
       .
       24: 76
     }
    } 
 ]

我的JAVA解决方案:

const { data: { data: [{ values }] } } = insightsData;

  const timesMap = new Map();

  values.forEach(item => {
    Object.entries(item.value).forEach(([key, value]) => {
      const timeValue = timesMap.get(key);
      if (timeValue) {
        timesMap.set(key, timeValue + value);
      } else {
        timesMap.set(key, value);
      }
    });
  });

2 个答案:

答案 0 :(得分:0)

如果您的数组长度相同,则可以将Array#reduceArray#map一起使用。

reduce将数组作为累加器r,如果累加器中不存在项,则使用值为零的logical OR ||



var counts = [{ date: "26.05.2018", value: [125, 100, 200] }, { date: "27.05.2018", value: [5, 6, 7] }, { date: "28.05.2018", value: [3, 4, 5] }],
    result = counts.reduce(
        (r, { value }) => value.map((v, i) => (r[i] || 0) + v),
        []
    );
    
console.log(result);




将对象作为value属性。



var counts = [{ date: "26.05.2018", value: { 0: 125, 1: 100, 2: 200 } }, { date: "27.05.2018", value: { 0: 5, 1: 6, 2: 7 } }, { date: "28.05.2018", value: { 0: 3, 1: 4, 2: 5 } }],
    result = counts.reduce(
        (r, { value }) => Object
            .entries(value)
            .reduce((s, [k, v]) => {
                s[k] = (s[k] || 0) + v;
                return s;
            }, r),
        {}
    );
    
console.log(result);




答案 1 :(得分:-1)

您可以对值进行迭代,并将它们添加到sum,就像这样

const data =  {date: "26.05.2018",
 value: [
   125,
   100,
   200,
 ]
} 

let sum = 0;
Object.values(data.value).forEach(elem => sum = sum + elem)
console.log(sum)

https://jsfiddle.net/5wwzn4yt/