2013-01-09 19 views
6

ここで私のJavaScriptの知識にはギャップがあります。特定の値のオブジェクト値の配列を検索して返したいと思います。jQueryを使用したJavascriptの効率的な検索配列

私は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; 

})(); 

それは動作しますが、私はもっとエレガントな方法があるものとして確信しています。教えてください!

EDIT - ソリューション

以下の彼の答えと@gdoronに感謝します。

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

注:myVarにはjQueryオブジェクトとしてラップされるため.get(0)エンドで添加しました。このため

+0

「* more efficient *」を定義します。 "*文字が少ない*"と誤解する人もいます。 – Alexander

+1

したがって、 'self.inventory.itemsArray'はセレクタまたはjQueryオブジェクトの配列ですか? – elclanrs

+0

IDで配列のインデックスを作成しないのはなぜですか?彼らはあなたがしなければならない 'return self.inventory。itemsArray [id] 'を実行し、ループを完全に回避します。 –

答えて

14

ネイティブjQueryの関数はfilterです:

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

それはあなたが持っているコードより短く、より重要な多くの、より読みやすいです。
効率については、可能な限り一致するものを見つけるためにセット内のすべての要素を繰り返しますが、アプリケーションのボトルネックとはほとんど考えられません。は、マイクロ最適化に焦点を当てません。

あなたは、Which is fasterについてEric Lipperのブログを読むことをお勧めします。私は、関数が実際に(外的コンテクスト変数に)行うことになっているものがわからないんですけれども

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

jqにネイティブ、言語にネイティブではありません。あなたはそれについてもっと正確にしたいかもしれません。 –

+2

@gustafr、私はそれが明らかだと信じていますが、私はそれを追加します。 – gdoron

+0

このソリューションは、不必要にjQueryオブジェクトの配列をラップします。 '$ .find'は関数を渡すときに' jQuery.grep'にマッピングされるので、@Brunoのように直接 'grep'を使うほうが良いでしょう。 –

0

、次のようになります。@Mattias Buelensにより示唆されるように

またgrepを使用することができますより効率的なサイクルごとの

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を使用してください。それでも、forループの簡単ながはるかに短く、よりパフォーマンスの高いです:

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

関連する問題