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

标签 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();
  };
});

我之前也尝试过 reduce 然后改用 grouBy 但它不起作用。

非常感谢。

最佳答案

这将帮助您:

_(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()

关于javascript - 按出现次数对数组进行分组并使用 Lodash 对其进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656597/

相关文章:

javascript - 在 Angular JS 中,如何将指令属性中的数据注入(inject)模板?

javascript - ng-repeat 基于 <select> 选项

Angular 2 - 消除 keyUp 事件

javascript - 制作自动更新的 facebook 风格的时间格式

javascript - 将选择重置为特定选项 AngularJs 和 Javascript/JQuery

javascript - 通过 Lodash 从数组创建对象映射

javascript - 使用后备值减少对象数组

javascript - 使用 firebase 云函数从 firebase 数据库中删除节点

当他们选择具有相同名称的文件时,不会触发 Javascript 文件输入 onchange

javascript - angularjs - 使用 ng-repeat 过滤 json api