2012-10-28 88 views
0

我在javascript中有一個對象數組。該對象包含一些屬性和看起來像這樣:在javascript數組中搜索項目的最佳方法

{ "Name" : "blabla", "Id": "1" } 

現在我有它接受一個參數,這將是該對象的名稱屬性值的函數。函數看起來有些事情是這樣的:

 function CheckForExistance(array, name){ 
     var exist = false; 

     $.each(array, function(index, value){ 
      if(value.Name == name) 
      { 
      exist = true; 
      return false; 
      } 
     }); 
     return exist; 
    } 

我想知道是否有更好的方法來做到這一點?

+0

你可能會在這裏找到答案:http://stackoverflow.com/questions/3975871/optimize-search-through-large-js-string-array – salih0vicX

+1

如果「Name」作爲對象的唯一標識符,那麼你應該直接將其用作對象內的成員名稱,然後直接訪問這些值而不進行搜索。 –

+0

也許他的數組只是他想用他的功能實現的一個例子。 –

回答

4

您可以使用$.grep()過濾數組以匹配,並返回.length的比較結果。

function CheckForExistance(array, name){ 
    return $.grep(array, function(obj) { 
     return obj.Name == name; 
    }).length > 0; 
} 

或者本地方法是一個更好的IMO,但你需要一箇舊的瀏覽器墊片。

function CheckForExistance(array, name){ 
    return array.some(function(obj) { 
     return obj.Name == name; 
    }); 
} 

這一個使用Array.prototype.some,並會盡快爲truthy返回值給出退出,然後將返回true。如果沒有找到真正的回報,那麼它將返回false


FWIW,你可以通過提供一個動態屬性名稱來使你的函數更健壯一些。

function CheckForExistance(array, prop, val){ 
    return array.some(function(obj) { 
     return obj[prop] == val; 
    }); 
} 

然後用它來檢查任何屬性值。

var found = CheckForExistance(myArray, "Name", "blabla"); 

或者另一種方法是使一個函數工廠,創建與迭代器使用的功能。

function havePropValue(prop, value) { 
    return function(obj) { 
     return obj[prop] == value; 
    }; 
} 

然後,我們可以只使用.some()直接而不需要CheckForExistance功能。

var found = myArray.some(havePropValue("Name", "blabla")); 

或與$.grep

var found = $.grep(myArray, havePropValue("Name", "blabla")).length > 0; 
+0

+1 .some(我不知道)。但有一點應該提到,在IE中<9 –

+0

@Robin:謝謝:)並且是'.some()'需要一個適用於舊瀏覽器的墊片。 –

-1

這應該工作:

function CheckForExistance(array, name){ 
      var exist = false; 
      $.each(array, function(index, value){ 
       if (value == name) { 
        exist = true; 
       } 
      }); 
      return exist; 
     } 

value.Name不是字符串。 通過數組循環時,您將獲得一個索引和一個值。

例如: 數組{1: 「foo」 的,2: 「酒吧」}給你 指標:1,值: 「foo」 的 指數:2,值: 「酒吧」

值是一個你想比較你的變量'名稱'。

2: 使'exists'爲true後返回false。那永遠不會給'回報'。使'存在'爲真後,你應該返回存在。

我想我的代碼就是你要找的。

+0

感謝您的回覆,但是'return false'是爲了打破每個循環,如果我找到對象 – user1740381

+0

爲什麼-1?我的代碼沒有問題。 –

+1

我沒有投票,但您的代碼無法運行。它總是會返回'false'。 'return true'在'$ .each'回調中,並且會被忽略。 –

2

如果它是一個簡單的數組對象,爲什麼不只是通過它的循環,而不是複雜的它爲什麼要使用$.each當普通的JavaScript是簡單

function CheckForExistance(array, name) { 
    for(var i=0;i<array.length;i++){ 
    if(array[i].Name==name) return true; 
    } 
    return false; 
} 
+0

爲什麼-1請賜教? –

+0

沒有簡單的詞典對象 - 它是一個對象文字數組 – Ian

+0

@ianpgall什麼廢話OP有'{「名稱」:「blabla」,「Id」:「1」}'爲什麼它不會工作? –

0

你也可以使用本機Array.fiter方法來確定名稱爲x的對象是否存在。 Filter返回一個新數組,其中包含與回調函數匹配的所有元素(返回true)。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

如果新數組的長度大於0,則至少有一個匹配元素。

function checkForExistance(arrayOfItems, name) { 
    return arrayOfItems.filter(function (item) { 
     return item.Name === name; 
    }).length > 0; 

} 


var arr = [{ 
    "Name": "blabla", 
    "Id": "1" 
}, { 
    "Name": "foo", 
    "Id": "2" 
}] 

console.log(checkForExistance(arr, "foo")); 

http://jsfiddle.net/Uawrb/1/

這不會在IE < 9工作,但如果你希望它太在那裏工作,你可以檢查出jQuery的$ .grep實現,它應該工作的跨瀏覽器:)

function checkForExistance(arrayOfItems, name) { 
    return $.grep(arrayOfItems, function (item) { 
     return item.Name === name; 
    }).length > 0; 

} 


var arr = [{ 
    "Name": "blabla", 
    "Id": "1" 
}, { 
    "Name": "foo", 
    "Id": "2" 
}] 

console.log(checkForExistance(arr, "foo"));​ 

http://jsfiddle.net/5vqqq/1/

相關問題