使用javascript/lodash对特定键的相同值进行分组、计数并将结果返回到数组

使用javascript/lodash对特定键的相同值进行分组、计数并将结果返回到数组,javascript,arrays,object,iterator,lodash,Javascript,Arrays,Object,Iterator,Lodash,我有一个对象集合,我使用lodash的uz.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" }, { "i

我有一个对象集合,我使用lodash的uz.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}
最好的方法是什么?

看看JSFIDLE

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}
var alarmTypes=[“危险”、“危险”、“警告”、“信息”、“成功”、“默认”、“危险”、“默认”、“默认”];
var alarmTypeCount={};
对于(变量i=0;i
这是一个单行程序

您不能有
[“危险”:3,“警告”:1,“信息”:1,“成功”:1,“默认”: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
   },{});

你是说
{“危险”:3,…}
?@Arg0n更正,谢谢。;-)顺便说一句,这有助于更好地理解过程,而不是公认的答案。
var alarmsTypes = _.reduce(result, function (ac,v) {

     if ( ac[v.alarm_type] ) {
       ac[v.alarm_type] ++;
     }else{
      ac[v.alarm_type] = 1;
     };
   return ac
   },{});