2013-01-09 38 views
6

我的JavaScript知識在這裏有一個空白。我想搜索一個特定值的對象值數組並返回它。Javascript高效的搜索陣列價值與jQuery

因爲我一直在寫JavaScript的一年,我一直在執行這樣的:

var itemClicked = (function(){ 

    var retval; 

    //Note self.inventory.itemsArray is an array of JS objects 

    $(self.inventory.itemsArray).each(function(i){ 
    if(parseInt(this.id) === parseInt(idOfItem)){ 
     retval = this; 
     return false; 
    } 
    }); 

    return retval; 

})(); 

它的工作原理,但我敢肯定的東西還有一個更優雅的方式。請告訴我!

編輯 - 解決方案

感謝下面他的回答@gdoron。

var myVar = $(self.owner.itemsArray).filter(function(){ 
    return parseInt(this.id) == parseInt(recItemID); 
}).get(0); 

注:.get(0)在結束時加入,因爲myVar的被包裝作爲jQuery對象。

+0

定義「*更高效*」。有些人會誤解「*少字符*」 – Alexander

+1

所以'self.inventory.itemsArray'是一個選擇器或jQuery對象的數組? – elclanrs

+0

爲什麼不通過id索引你的數組?他們你只需要'返回self.inventory。itemsArray [id]'並完全避免循環。 –

回答

14

本機jQuery的功能,這是filter

$(data).filter(function(){ 
    return this.id == "foo"; 
}); 

它比短的代碼你有更重要的了很多更具可讀性。
關於效率,它會迭代集合中的所有元素以儘可能多地找到匹配,但我不相信這將成爲應用程序的瓶頸,不關注微優化

我建議你閱讀Eric Lipper的博客約Which is faster

您還可以使用grep的建議通過@Mattias Buelens:

$.grep(data, function(ele){ 
    retun ele.id == "foo"; 
}); 
+3

原生jq,不是原生語言。你可能想要更精確一點。 –

+2

@gustafr,我相信這很明顯,但我會添加它。 – gdoron

+0

儘管此解決方案不必要地將數組封裝在jQuery對象中。在傳遞函數時,'$ .find'映射到'jQuery.grep',所以最好直接使用'grep',就像@Bruno所示。 –

0

雖然我不能確定什麼功能實際上是應該做的(由於外部環境變量),下面應該是更有效的週期明智

var itemClicked = (function(){ 

    var i, array = self.inventory.itemsArray, length = array.length; 

    for(i=0; i < length; i++) { 

    if(parseInt(array[i].id) === parseInt(idOfItem)){ 
     return array[i]; 
    } 

    } 

    return undefined; 

})(); 
0

它的JavaScript對象的數組

然後根本不使用jQuery。至少,使用$.each而不是圍繞數組構建一個包裝器對象。儘管如此,循環簡單更短,更高性能:

var itemClicked = (function(idnum) { 
    var arr = self.inventory.itemsArray; 
    for (var i=0, l=arr.length; i<l; i++) 
     if (parseInt(arr[i].id, 10) === idnum) 
      return arr[i]; 
})(parseInt(idOfItem, 10)); 

你還不如想存儲的ID屬性的數字馬上的,所以你不需要它每次轉換。

4

又一個選項使用jQuery的$.grep()功能

var arr = $.grep(self.inventory.itemsArray, function (n) { 
    return n.id == idOfItem; 
}); 

上面將返回匹配的數組元素的數組。如果你只是想第一個,如果它存在,很容易返回arr[0]

+0

不是grep返回一個數組,而不是第一個匹配的對象? – Bergi

+1

與'$ .filter'相反,'jQuery.grep'不會不必要地將數組包裝在一個jQuery對象中。雖然這兩種解決方案仍然可以找到*全部*匹配元素。我似乎無法找到一個原生的'Array'方法或jQuery函數,它可以在第一次匹配後停止搜索。 –

+0

@MattiasBuelens,'each'返回false時會停止迭代。儘管我仍然會使用'filter',因爲它更具可讀性。 – gdoron