【问题标题】:Group an array by occurrences and sort it with Lodash按出现次数对数组进行分组并使用 Lodash 对其进行排序
【发布时间】:2016-10-06 00:17:33
【问题描述】:

如果有这个数组:

[
  {
    "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 但它不起作用。

非常感谢。

【问题讨论】:

    标签: javascript angularjs lodash


    【解决方案1】:

    这将对您有所帮助:

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

    【讨论】:

    • 非常感谢,它有效!但我不确定 sortBy 是否正常工作。
    • 非常感谢@Max!
    【解决方案2】:

    你可以简单地使用

    _.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 });
    });
    

    【讨论】:

      猜你喜欢
      • 2017-09-08
      • 2015-05-10
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多