用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属性立即存储为数字,因此您不需要每次都将其转换为数字。