20

私はこのスタックの質問「UnderscoreforJavascriptを使用して重複するオブジェクトを削除する」を見てきましたが、それはまさに私がやろうとしていることですが、どの例も機能しません。実際、_。uniqで動作するイテレータ関数を取得できません。

_.uniq([1, 2, 1, 3, 1, 4]);
> [1, 2, 3, 4]
_.uniq([1, 2, 1, 3, 1, 4], false, function(a){ return a===4;});
> [1, 2, 3, 4]
_.uniq([1, 2, 1, 3, 1, 4], true, function(a){ return a===4;});
> [1, 2, 1, 3, 1, 4]
_.uniq([1, 2, 1, 3, 1, 4], false, function(a){ return false;});
> [1, 2, 3, 4]
_.uniq([1, 2, 1, 3, 1, 4], false, function(a){ return true;});
> [1, 2, 3, 4]

var people = [ { name: 'John', age: 20 }, { name: 'Mary', age: 31 }, { name: 'Kevin', age: 20 }]; 
_.uniq(people, false, function(p){ return p.age; });

> [ { age: 20, name: "John" }, 
    { age: 31, name: "Mary" },
    { age: 20, name: "Kevin" } ]

私はします:

_.uniq(_.map(people, function(p){ return p.age; }));
> [20, 31]

ただし、元のオブジェクトではなく、マップされた値のみを返します。

助けていただければ幸いです。アンダースコアバージョン1.1.7を使用しています

4

2 に答える 2

23

私も同じ問題を抱えていました。これは、_。uniq()が新しい縮小配列を返すため、変数に割り当てる必要があるために発生します。したがって、この小さな修正で機能する必要があります。

var people = [{名前:'ジョン'、年齢:20}、{名前:'メアリー'、年齢:31}、{名前:'ケビン'、年齢:20}];

people = _.uniq(people、false、function(p){return p.age;});

[{年齢:20、名前: "ジョン"}、{年齢:31、名前:"メアリー"}]

于 2014-07-18T07:20:38.553 に答える
15

_.uniqの比較関数は1.2.0で導入されたようです

変更ログから:

_.uniqにオプションのイテレータを渡して、オブジェクトを一意と見なす基準を決定できるようになりました。

于 2012-10-23T16:42:50.787 に答える