6

ここで私のJavaScriptの知識にギャップがあります。オブジェクト値の配列で特定の値を検索して返したいのですが。

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

})();

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

編集-解決策

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

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

注:.get(0)myVarはjQueryオブジェクトとしてラップされているため、最後に追加されました。

4

4 に答える 4

15

このためのネイティブjQuery関数は次のfilterとおりです。

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

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

どちらが速いかについてのEricLipperブログを読むことをお勧めします。

grep@MattiasBuelensが提案したように使用することもできます。

$.grep(data, function(ele){
    retun ele.id == "foo";
});
于 2013-01-09T22:27:16.727 に答える
4

jQueryの$.grep( )機能を使用した別のオプション

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

上記は、一致する配列要素の配列を返します。最初のものだけが必要な場合は、存在する場合は簡単に返すことができarr[0]ます。

于 2013-01-09T22:42:16.830 に答える
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;

})();
于 2013-01-09T22:37:27.473 に答える
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 プロパティをすぐに数値として保存することを考えたほうがよいので、毎回変換する必要はありません。

于 2013-01-09T22:38:40.977 に答える