1

次の構造で _.uniq() を動作させようとしています:

[
    {'x' : 1, 'y': 2},
    {'x' : 1, 'y': 2},
    {'x' : 2, 'y': 3},
    {'x' : 2, 'y': 4},
    {'x' : 3, 'y': 4}
]

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

[
    {'x' : 1, 'y': 2},
    {'x' : 2, 'y': 3},
    {'x' : 2, 'y': 4},
    {'x' : 3, 'y': 4}
]

つまり、重複するアイテムが削除されます。stringify は避けたいと思います。なぜなら、それぞれを解析して JSON オブジェクトに戻すだけだからです。

どんな助けでも大歓迎です。

編集:以下のマットの解決策を試してください。私が思うに何かが欠けています-これは機能しません。a と b の値をログに記録すると、

_.uniq($scope.validNotes, function (a, b) {
    console.log(a, b);
    return a.x === b.x && a.y === b.y;
});


Object {x: 2, y: 3} 0 
Object {x: 1, y: 0} 1 
Object {x: 2, y: 3} 2 
Object {x: 3, y: 2} 3 
Object {x: 4, y: 2} 4
Object {x: 5, y: 1} 5

これは明らかに、私がだましを見つけることは決してないことを意味します

4

2 に答える 2

8

2 つのオブジェクトが==or===ではないため、同じキーを持っているという理由だけで、関数;の[iterator]引数を使用する必要があります。uniq()

_.uniq(myArray, function (item) {
    return item.x + item.y;
});

一意の文字列の組み合わせを返す必要があることに注意してください。と の場合を考えてみましょ{ x: 11, y: 1 }{ x: 1, y: 11 }。私のコードは両方を に解決し111、それらを同じものとして扱います。

何かのようなもの:

_.uniq(myArray, function (item) {
    return 'x:' + item.x + 'y:' + item.y;
});

... より弾力性がありますが、もちろん、データの値によって異なります。

于 2013-11-11T12:09:14.360 に答える