按出现次数对数组进行分组,并使用Lodash对其进行排序

时间:2016-06-06 11:45:01

标签: javascript angularjs lodash

如果有这个数组:

[
  {
    "name" : "lala",
    "source_ip" : "10.10.10.10"
  },
  {
    "name" : "lulu",
    "source_ip" : "10.10.10.11"
  },
  {
    "name" : "lolo",
    "source_ip" : "10.10.10.10"
  }
]

我想按事件分组并使用Lodash对其进行排序以获得此结果:

[
  {
    "source_ip" : "10.10.10.10",
    "count" : 2
  },
  {
    "source_ip" : "10.10.10.11",
    "count" : 1
  },
]

以下是我的尝试:

app.filter('top10', function() {
  return function(incidents) { 
    return _.chain(incidents)
        .countBy("source_ip")
        .value();
  };
});

我之前尝试过减少,然后使用 grouBy ,但它不起作用。

非常感谢。

2 个答案:

答案 0 :(得分:3)

这将对您有所帮助:

_(array)
  .countBy("source_ip")
  .map(function(count, ip) { return { count: count, source_ip: ip }})
  .sortBy('-count')
  .value()

Lodash docs

备注:

  • sortBy('-count')按财产进行反向排序
  • map可以迭代对象并传递给功能键,因此您可以从对象
  • 生成数组
  • _()符号表示_.chain()

更新2017.01.20

我们甚至可以做得更优雅:

_(array)
  .countBy("source_ip")
  .invert()
  .sortBy('-count')
  .value()

答案 1 :(得分:1)

您只需使用

即可
_.countBy(array, "source_ip"); // => { 10.10.10.10: 2, 10.10.10.11: 1 }

如果你需要一个阵列:

var result=[];
_.forIn(_.countBy(doc, "source_ip"), function(value, key) {
    result.push({ "source_ip": key, "count": value });
});