28

_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 はこれを行うのが速いと思いますか?? それがばかげている場合は、他の解決策を受け入れるので、教えてください。

4

4 に答える 4

82

適切な解決策は、オプションの iterator 関数を使用して下線のuniq関数を使用することです。

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

ドキュメント: http://underscorejs.org/#uniq

于 2013-12-08T02:37:53.363 に答える
17

関数を探していると思いますcountBy

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

結果は次のようになります。

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

JSFiddle デモ: http://jsfiddle.net/4J2SX/

于 2013-10-09T01:10:00.550 に答える
1

必要に応じてアンダースコアの 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/

于 2013-10-09T01:19:05.410 に答える