6

我的 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";
});

它比您拥有的代码更短,更重要的是更具可读性。
关于效率,它会迭代集合中的所有元素以找到尽可能多的匹配项,但我几乎不相信它会成为您应用程序的瓶颈,不要专注于微优化

我建议您阅读 Eric Lipper 的博客,了解哪个更快

您也可以grep按照@Mattias Buelens 的建议使用:

$.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 回答