web-dev-qa-db-ja.com

Underscore.jsは、オブジェクトの配列で一意の値を見つけます。一意のアイテムとその数を返す

_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がこれを素早く行うと仮定していますか?それが愚かな遅い場合、私は他の解決策にオープンになるだろう原因を教えてください。

25
That1guyoverthr

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

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

結果を生成します:

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

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

16
howrad

良い解決策は、オプションのイテレータ関数を使用してアンダースコアのuniq関数を使用することです。

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

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

76
jakecraige

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

1
Craig MacGregor

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/

0
Amil Sajeev