使用 map/reduce 计算总数

Using map/reduce to calculate totals

我想创建一个函数来对以下数据进行一些数组操作(见下文)。想知道使用 map/forEach 或 Reduce 是否有一种巧妙的方法?

function calculateTotalSelections {
        "selections":[
        {
            "item_selected": 1,
        },
        {
            "item_selected": 3,
        },
        {
            "item_selected": 4
        },
        {
            "item_selected": 4
        },
        {
            "item_selected": 1567486585
        },
        {
            "item_selected": 1567486585
        }
    ]
}

returns 一些输出像

item 4 was selected twice

item 1 was selected once

item 1567486585 was selected once

(约束:项目选择可以是未知的)

尝试通过迭代创建此地图

var output = {};
selections.forEach(function(val){
  var value = val["item_selected"];
  output[value] = output[value] || 0;
  output[value]++;
});

现在output有每个值的频率

您可以使用 reduce 创建一个以项目 ID 为键,以它们的频率为值的对象。

selections.reduce(function(frequencies, item){
    if (!item.item_selected) return frequencies;
    frequencies[item.item_selected] = (frequencies[item.item_selected] || 0) + 1;
    return frequencies;
}, {});
// --> { '1': 1, '3': 1, '4': 2, '1567486585': 2 }