在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。