用jQuery实现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对象。

本机jQuery函数是filter

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

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

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

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

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

使用jQuery的$.grep( )函数的另一种选择

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

以上返回匹配数组元素的数组。 如果您只是想要第一个,那么返回arr[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; })(); 

这是一个Javascript对象数组

然后根本不要使用jQuery。 至少,使用$.each而不是在数组周围构建包装器对象。 尽管如此,一个简单的for循环更短,性能更高:

 var itemClicked = (function(idnum) { var arr = self.inventory.itemsArray; for (var i=0, l=arr.length; i 

您可能会想到将id属性立即存储为数字,因此您不需要每次都将其转换为数字。