6

我有很多对象试图从中过滤掉重复项。当一个对象具有IMAGEURL另一个对象中存在的属性时,我想忽略该对象并继续前进。

我正在使用nodeJS它,所以如果有一个库我可以使用它来使它更容易让我知道。

在检查数组中的字符串值之前,我已经完成了类似的实现,例如:

var arr = ['foo', 'bar'];
if(arr.indexOf('foo') == -1){
   arr.push('foo')
}

但这对对象不起作用,据我所知。我在这里有什么选择?更简单地说:

var obj1 = {IMAGEURL: 'http://whatever.com/1'};
var obj2 = {IMAGEURL: 'http://whatever.com/2'};
var obj3 = {IMAGEURL: 'http://whatever.com/1'};

var arr = [obj1, obj2, obj3];
var uniqueArr = [];

for (var i = 0; i<arr.length; i++){
    // For all the iterations of 'uniqueArr', if uniqueArr[interation].IMAGEURL == arr[i].IMAGEURL, don't add arr[i] to uniqueArr
}

我怎样才能做到这一点?

4

2 回答 2

12

你可以只使用一个内部循环(通过使用变量来跟踪我们是否已经看到循环seen——你实际上可以在这里使用标签,但我发现变量方法更容易阅读):

for (var i = 0; i<arr.length; i++){
    var seen = false;
    for(var j = 0; j != uniqueArr.length; ++j) {
        if(uniqueArr[j].IMAGEURL == arr[i].IMAGEURL) seen = true;
    }
    if(!seen) uniqueArr.push(arr[i]);
}
于 2013-08-17T04:26:34.737 回答
3

这是一个简洁的方法:

var uniqueArr = arr.filter(function(obj){
    if(obj.IMAGEURL in this) return false;
    return this[obj.IMAGEURL] = true;
}, {});

http://jsfiddle.net/rneTR/2

注意:这很简洁,但比Nirk 的回答慢了几个数量级

另见: http: //monkeyandcrow.com/blog/why_javascripts_filter_is_slow/

于 2013-08-17T04:46:47.547 回答