在javascript中查询数组以获取我想要的项目的最佳方法是什么?

我有一个这样的数组(只有超过3000个对象而不是3个):

items = [{name:'charlie', age:'16'}, {name:'ben', age:'18'}, {name:'steve', age:'18'}] 

只返回18岁人物的最佳方法是什么? 所以我想:

 items = [{name:'ben', age:'18'}, {name:'steve', age:'18'}] 

我能想到的最好的是(使用jQuery):

 newArray = [] $.each(items, function(index, item) { if(item.age=='18') { newArray.push(item) } }) 

考虑到有3000万个物体,而且我将一次性进行多达五十次的比较,这就是很多循环。 有没有更好的办法?

你可以使用纯JavaScript

 var wanted = items.filter( function(item){return (item.age==18);} ); 

如果您的浏览器不支持1.6版本的javascript,您可以在https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter找到过滤方法的实现。


更新

Speedwise有一个巨大的变化测试中有错误与正常循环的差异( 取决于浏览器 )..看看我在http://jsperf.com/array-filter-vs-制作的这个小测试环路/ 3

如果您要经常进行搜索,最好将数据版本保存在可快速访问的表单中。 我使用了underscore.js(http://documentcloud.github.com/underscore/)让自己变得简单,但这里的代码将创建一个对象,用于保存由age字段索引的数据。

你得到的东西看起来像这样:

 { "16": [ { "name": "charlie", "age": "16" } ], "18": [ { "name": "ben", "age": "18" }, { "name": "steve", "age": "18" } ] } 

代码:

 var itemsByAge = _(items).reduce(function(memo, item) { memo[item.age] = memo[item.age] || []; memo[item.age].push(item); return memo; }, {}); alert(JSON.stringify(itemsByAge["18"])); 

无论你选择哪种方法(items.filter或json的任何“查询语言”),for循环都是不可避免的。

如果性能是一个问题,我建议你使用纯javascript而不是像jQuery这样的库,这将增加整个处理的开销,这在这里很明显。

因此,您的代码看起来像:

 var newArray = []; for(var i=0;i 

利用javascript宏函数eval()在运行时将字符串作为代码进行求值,我们可以为Array类型定义一个原型方法

 Array.prototype.where = function (query) { var newArray = []; for(var i=0; i 

并将其与任何数组一起使用,将查询作为字符串传递

 var newArray= items.where('.age >= 18'); 

使用数组的filter方法,它为数组中的每个元素调用一次提供的回调函数。

 array.filter([, ]) 

一旦我有这样的问题,我就像这样解决它1-创建一个数组2-数组,每个索引创建一个索引记录,例如

 var pAry=[]; var cAry=[{name:'ben', age:'18'}, {name:'steve', age:'18'}] pAry[17]=cAry; 

这样,当你需要18岁的人时,你将获得指数17。