【问题标题】:Using javascript/lodash to group identical values for a specific key and count them and return results to an array使用 javascript/lodash 对特定键的相同值进行分组并对它们进行计数并将结果返回到数组
【发布时间】:2015-11-26 16:35:34
【问题描述】:

我有一个对象集合,我使用 lodash 的 _.map 函数从中获取特定键的所有对应值:

[{
    "id": 1,
    "alarm_type": "danger",
    "data": "Dapibus ac facilisis in facilisilitumas el perfertum"
}, {
    "id": 2,
    "alarm_type": "danger",
    "data": "Cras sit amet nibh libero"
}, {
    "id": 3,
    "alarm_type": "warning",
    "data": "Porta ac consectetur ac"
}, {
    "id": 4,
    "alarm_type": "info",
    "data": "Vestibulum at eros porta ac consectetur ac"
}, {
    "id": 5,
    "alarm_type": "success",
    "data": "Morbi leo risus"
}, {
    "id": 6,
    "alarm_type": "default",
    "data": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}, {
    "id": 7,
    "alarm_type": "danger",
    "data": "Cras sit amet nibh libero"
}, {
}, {
    "id": 8,
    "alarm_type": "default",
    "data": "Dolor sit amet, consectetur adipiscing."
}, {
    "id": 9,
    "alarm_type": "default",
    "data": "Dolor sit amet, consectetur adipiscing elit."
}]

javascript函数:

var alarmsQueue = alarms.getAlarms();

alarmsQueue.then(function(result) {

    var alarmsTypes = _.map(result, 'alarm_type');

    console.log(alarmsTypes);

});

结果是以下数组:

["danger", "danger", "warning", "info", "success", "default", "danger", "default", "default"]

而我想从上一个中获取以下对象:

{"danger": 3, "warning": 1, "info": 1, "success": 1, "default": 3}

最好的方法是什么?

【问题讨论】:

  • 你不是说{"danger": 3, ...}吗?
  • @Arg0n 已更正,谢谢。 ;-)

标签: javascript arrays object iterator lodash


【解决方案1】:

这是一个使用_.countBy 的单行代码。

_.countBy(alarmsTypes)

【讨论】:

    【解决方案2】:

    thisJSFiddle

    JavaScript

    var alarmTypes = ["danger", "danger", "warning", "info", "success", "default", "danger", "default", "default"];
    
    var alarmTypeCount = {};
    
    for(var i = 0; i < alarmTypes.length; i++){
        var alarmType = alarmTypes[i];
        if(alarmTypeCount[alarmType]) {
            alarmTypeCount[alarmType]++;
        } else {
            alarmTypeCount[alarmType] = 1;
        }
    }
    
    console.log(JSON.stringify(alarmTypeCount)); // {"danger":3,"warning":1,"info":1,"success":1,"default":3}
    

    【讨论】:

    • 顺便说一句,它比公认的答案更有助于理解这个过程。
    【解决方案3】:

    你不能有["danger": 3, "warning": 1, "info": 1, "success": 1, "default": 3]

    但您可以将对象中的键值分组并具有:

    [{"danger": 3}, {"warning": 1}, ....]
    

    或使用键值对创建一个独特的对象,例如:

     {"danger": 3, "warning": 1, ....}
    

    这里是使用reduce方法的第二种情况的解决方案:

    var alarmsTypes = _.reduce(result, function (ac,v) {
    
         if ( ac[v.alarm_type] ) {
           ac[v.alarm_type] ++;
         }else{
          ac[v.alarm_type] = 1;
         };
       return ac
       },{});
    

    fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-21
      • 2020-08-09
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2016-10-06
      相关资源
      最近更新 更多