从对象数组中删除重复项 - 下划线

Nat*_*han 1 javascript underscore.js

试图让_.uniq()处理以下结构:

[
    {'x' : 1, 'y': 2},
    {'x' : 1, 'y': 2},
    {'x' : 2, 'y': 3},
    {'x' : 2, 'y': 4},
    {'x' : 3, 'y': 4}
]
Run Code Online (Sandbox Code Playgroud)

结果应该是:

[
    {'x' : 1, 'y': 2},
    {'x' : 2, 'y': 3},
    {'x' : 2, 'y': 4},
    {'x' : 3, 'y': 4}
]
Run Code Online (Sandbox Code Playgroud)

即删除重复的项目.我想避免使用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
Run Code Online (Sandbox Code Playgroud)

这显然意味着我永远不会发现任何欺骗

Mat*_*att 8

因为两个对象不是==或者===,因为它们具有相同的键,所以需要使用函数[iterator]参数uniq() ;

_.uniq(myArray, function (item) {
    return item.x + item.y;
});
Run Code Online (Sandbox Code Playgroud)

请注意,您需要返回唯一的字符串组合; 考虑的情况下,{ x: 11, y: 1 }{ x: 1, y: 11 }; 我的代码将解析它们111,并将它们视为相同.

就像是:

_.uniq(myArray, function (item) {
    return 'x:' + item.x + 'y:' + item.y;
});
Run Code Online (Sandbox Code Playgroud)

...当然会更有弹性,但这取决于数据的价值.