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

时间:2013-11-11 12:03:46

标签: javascript underscore.js

尝试让_.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对象。

任何帮助都将不胜感激。

编辑:在下面给Matt的解决方案,我想错了一些我认为 - 这不起作用。如果我记录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

这显然意味着我永远找不到任何欺骗

2 个答案:

答案 0 :(得分:8)

由于两个对象不是=====,只是因为它们具有相同的密钥,因此您需要使用[iterator] argument of the uniq() function;

_.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;
});

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

答案 1 :(得分:0)

如果你的JSON中有抽象的数据结构,那么使用stringify比较一个像字符串一样的数组元素会更好。因为每个数组元素中都有新对象,所以每个文字对象表示法{}都会用javascript语言创建新对象,并且它不具有相同属性或不具有相同属性。

但是,如果您的结构类似于x,则使用Matt answer