【问题标题】:Check whether an object with property value 'x' exists in an array in Javascript检查Javascript中的数组中是否存在属性值为'x'的对象
【发布时间】:2013-08-19 13:18:56
【问题描述】:

我有很多对象试图从中过滤掉重复项。当一个对象有一个属性 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
}

我该怎么做?

【问题讨论】:

    标签: javascript arrays object for-loop


    【解决方案1】:

    你可以只使用一个内部循环(通过使用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 &lt; uniqueArr.length吗?不太明白这里发生了什么。
    • @Jascination 在这种情况下,您可以使用&lt; 而不是!=。在这种特殊情况下,由于j 每一步都会增加1,因此两者都会产生相同的结果。我只是在这些循环中默认使用!=(必要时选择&lt;&gt;
    【解决方案2】:

    这是一个简洁的方法:

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

    http://jsfiddle.net/rneTR/2

    注意:这是简洁的,但orders of magnitude slowerNirk's answer

    另请参阅:http://monkeyandcrow.com/blog/why_javascripts_filter_is_slow/

    【讨论】:

    • 你可以这样做uniqueArr = arr.filter(function(obj){return (uniqueArr.map(function(x){return x.IMAGEURL;}).indexOf(obj.IMAGEURL) != -1) ? false : (uniqueArr.push(obj), true);});,但我强烈建议不要这样做,除非你知道自己在做什么
    猜你喜欢
    • 2020-11-30
    • 2020-08-08
    • 2014-09-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多