在Javascript中检查一个具有属性值'x'的对象是否存在于数组中。

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
}

我该如何做到这一点?
2个回答

12

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

你可以只需使用内部循环(通过使用一个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]);
}

你能解释一下为什么要使用j != uniqueArr.length而不是j < uniqueArr.length吗?我不太明白这里的问题。 - JVG
1
@Jascination 在这种情况下,你可以使用 < 而不是 !=。在这种特殊情况下,由于 j 每次增加 1,两者产生的结果相同。我通常默认在这些循环中使用 !=(必要时选择 <>)。 - SheetJS

3

你可以使用以下代码:uniqueArr = arr.filter(function(obj){return (uniqueArr.map(function(x){return x.IMAGEURL;}).indexOf(obj.IMAGEURL) != -1) ? false : (uniqueArr.push(obj), true);});,但我强烈建议除非你知道自己在做什么,否则不要这样做。 - SheetJS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接