【问题标题】:Underscore.js find unique values in array of objects; Return unique items and their countUnderscore.js 在对象数组中查找唯一值;返回唯一项目及其数量
【发布时间】:2013-10-09 00:49:12
【问题描述】:

我正在使用 _underscore.js 查找数组中的所有唯一项,但我不知道如何获取返回的唯一项的数量。

_PERSONARRAY = [{name:"tom",age:7}{name:"john",age:9}{name:"becky",age:2}{name:"sam",age:7}]

_UNIQUEAGEARRAY = _.chain(_PERSONARRAY).map(function(person) { return person.age }).uniq().value();

在这种情况下,_UNIQUEAGEARRAY 将等于:

[7,9,2]

我真正需要返回的是这样的:

[{uniqueAge:7,numberOfPeople:2}{uniqueAge:9,numberOfPeople:1}{uniqueAge:2,numberOfPeople:1}]

感谢您的帮助。另外,我假设 _underscore.js 很快就能做到这一点?如果它很愚蠢,请告诉我,因为我愿意接受其他解决方案。

【问题讨论】:

    标签: javascript underscore.js unique


    【解决方案1】:

    一个不错的解决方案是使用可选的迭代器函数来下划线的uniq 函数:

    let people = [
      {name: "Alice", age: 21}, 
      {name: "Bob", age: 34},
      {name: "Caroline", age: 21}
    ];
    _.uniq(people, person => person.age);
    

    文档:http://underscorejs.org/#uniq

    【讨论】:

      【解决方案2】:

      我认为您正在寻找 countBy 函数:

      _UNIQUEAGEARRAY = _.countBy(_PERSONARRAY, "age");
      

      它产生结果:

      {"2":1,"7":2,"9":1}
      

      JSFiddle 演示:http://jsfiddle.net/4J2SX/

      【讨论】:

      • 然后你可以简单地通过map运行它来得到你想要的对象结构(更新在jsfiddle.net/4J2SX/2
      • 如此简单!谢谢大家!
      • @howard 假设我有这个对象数组: [{couponid: 500 locationid: 10 },{couponid: 600 locationid: 15 }, { couponid: 500 locationid: 10 }, { couponid: 500 locationid: 20 } ] 使用您提供的解决方案,我得到了一组唯一优惠券 ID,每个唯一优惠券 ID 都有计数;这是我经过大量搜索后找到的最简洁的答案;你能告诉我,现在我怎样才能得到每个唯一的优惠券ID,有多少个唯一的位置ID?即在上面的优惠券 500 中将有 2,而优惠券 600 将有 1。我应该将此作为单独的问题发布吗?
      【解决方案3】:

      如果需要,您可以使用下划线的 groupBy(对于大型数据集可能不是一个好主意,因为它保留了所有分组项目的列表)

      例子:

      var d = _.groupBy(_PERSONARRAY, function(p){ 
          return p.age;
      });
      

      如果您想将其映射到您的确切格式,请尝试在 groupBy 之后进行映射:

      var x = _.map(d, function(people, age) {   
          return {uniqueAge: age,  numberOfPeople: people.length};   
      });
      

      jsFiddle:http://jsfiddle.net/jsgkC/2/

      【讨论】:

      • 注意:groupBy、countBy、indexBy 在内部都使用相同的“group”函数,所以从性能的角度来看,我不知道一个是否比另一个好得多。您可以在此处查看带注释的来源:underscorejs.org/docs/underscore.html
      【解决方案4】:

      groupBy 函数很有用。

      _personsList = [{name:"anjo",age:5},{name:"george",age:3},{name:"jack",age:5}];
      _uniqAgeList = _.groupBy(_personsList, "age");
      

      会产生输出

      {
          "3":[{"name":"george","age":3}],
          "5":[{"name":"anjo","age":5},{"name":"jack","age":5}]
      }
      

      jsfiddle :http://jsfiddle.net/4J2SX/199/

      【讨论】:

        猜你喜欢
        • 2019-11-14
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 2015-12-27
        • 2020-12-19
        • 2021-03-03
        • 1970-01-01
        相关资源
        最近更新 更多