簡體   English   中英

檢查Javascript中的數組中是否存在屬性值為“x”的對象

[英]Check whether an object with property value 'x' exists in an array in Javascript

我有很多對象,我試圖從中刪除重復項。 當一個對象有一個屬性, 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
}

我怎樣才能做到這一點?

你可以使用一個內循環(跟蹤我們是否通過使用一個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]);
}

這是一個簡潔的方法:

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM