通过相同的键将JavaScript数组对象分组

时间:2018-11-23 09:58:51

标签: javascript arrays foreach

我有一个对象数组,其中一些具有相同的月份名称,但基于日期的值不同。 我们如何基于相同的属性值对数组对象进行分组,例如:

 [ { month: 'Jan', value: 3 },
  { month: 'Jan', value: 3.5 },
  { month: 'Feb', value: 2.1 },
  { month: 'Mar', value: 6 },
  { month: 'Apr', value: 4.3 },
  { month: 'May', value: 5.5 },
  { month: 'Jun', value: 7 },
  { month: 'Jun', value: 9 },
  { month: 'Jul', value: 7 },
  { month: 'Jul', value: 9 },
  { month: 'Jul', value: 7 },
  { month: 'Aug', value: 9 },
  { month: 'Sep', value: 9 },
  { month: 'Sep', value: 9 },
  { month: 'Oct', value: 8 },
  { month: 'Oct', value: 5 },
  { month: 'Oct', value: 3 },
  { month: 'Nov', value: 12 },
  { month: 'Nov', value: 19.5 } ]

所以我想得到的是带有月份和月份总和的新数组:

[{month:"Jan", val:6.5},{month:"Feb", val:5.6},{month:"Mar", val:6},].

3 个答案:

答案 0 :(得分:3)

您可以使用Map并通过将值添加到从分组结果中获取新数组的month中来减少数组。

var data = [{ month: 'Jan', value: 3 }, { month: 'Jan', value: 3.5 }, { month: 'Feb', value: 2.1 }, { month: 'Mar', value: 6 }, { month: 'Apr', value: 4.3 }, { month: 'May', value: 5.5 }, { month: 'Jun', value: 7 }, { month: 'Jun', value: 9 }, { month: 'Jul', value: 7 }, { month: 'Jul', value: 9 }, { month: 'Jul', value: 7 }, { month: 'Aug', value: 9 }, { month: 'Sep', value: 9 }, { month: 'Sep', value: 9 }, { month: 'Oct', value: 8 }, { month: 'Oct', value: 5 }, { month: 'Oct', value: 3 }, { month: 'Nov', value: 12 }, { month: 'Nov', value: 19.5 }],
    result = Array.from(
        data.reduce(
            (m, { month, value }) => m.set(month, (m.get(month) || 0) + value),
            new Map
        ),
        ([month, value]) => ({ month, value })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

一个简单的人类可读的解决方案如下:

{{1}}

答案 2 :(得分:0)

 result = input.reduce(function(res, value){
            if (!res[value.month]) {
                res[value.month] = {
                    month: value.month,
                    value: 0
                }
                result.push(res[value.month])
            }
            res[value.month].value += value.value
            return res;
           }, {});
             console.log(result)