什么是最好的方式来查询JavaScript中的数组来获取我想要的项目?

问题描述:

我有一个这样的数组(刚刚超过3000个对象,而不是这里的3):什么是最好的方式来查询JavaScript中的数组来获取我想要的项目?

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) 
    } 
}) 

考虑到有300万点的对象,而且也是我会做的是比较达一次去五十次,这是很多循环。有没有更好的办法?

+0

为了进一步澄清,我从数据库的初始页面加载创建此数组。在整个体验过程中都需要相同的信息,所以我认为从这个数组访问它可能会比每次调用数据库都快。无论如何我都需要它,所以我猜这是有道理的。如果有更好的方法纠正我。 – 2011-03-10 10:15:29

+0

See below: http://*.com/questions/777455/is-there-a-query-language-for-json – Brij 2011-03-10 09:41:51

+0

肯尼:你看@大卫的解决方案!!?!? – billy 2012-05-03 18:00:50

您可以使用纯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


发现过滤方法的实现更新

快速有个 巨大的 变化(取决于浏览器)(有在测试错误)差从正常回路..看一看这个小测试我在http://jsperf.com/array-filter-vs-loop/3

+0

这看起来相当简单,我喜欢它,并且可以更多地使用它。只是围绕一些其他的建议来看看是否有什么更好的性能方面,我认为这在后台循环很多,但也许这不会是一个问题。 – 2011-03-10 10:10:19

+0

@Kenny Flannery:“缺点”是你为每个项目调用一个函数。正常的'for'循环可能会更快。 – 2011-03-10 10:35:00

+0

不错的测试链接,现在使用for循环。 – 2011-03-11 01:08:38

使用阵列的过滤器制造方法它会为数组中的每个元素调用一次提供的回调函数。

array.filter(<callbackfucntion>[, <Object to use>]) 
+0

你不得不提到,这是ES5中引入的方法,可能在所有浏览器(特别是旧版本)中都不可用。 – 2011-03-10 09:52:18

+1

啊学到了新东西!不知道。谢谢@Felix – CloudyMarble 2011-03-10 10:09:16

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

如果性能是一个问题,我会建议您使用纯JavaScript而不是类似jQuery的库,这会增加整个处理的开销,这是明显的here

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

var newArray = []; 
for(var i=0;i<items.length;i++) { 
    var item = items[i]; 
    if(item.age == '18') { 
     newArray.push(item); 
    } 
}); 

如果你打算做搜索往往也可能是最好保持一个版本的数据的一种形式,它是快速访问。 我已经使用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"])); 
+0

不错!在阅读这个问题时,我正在考虑这样的事情! – billy 2012-05-03 17:58:12

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

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

当u需要的人与18岁这样,您将获得指数17

+0

这与我所解决的问题很接近,除了所有的关联数组或对象外。 – 2011-03-12 04:09:09

利用JavaScript的宏伟功能eval()的,其评价串在运行时代码,我们可以定义为一个原型法阵列型

Array.prototype.where = function (query) { 
var newArray = []; 
for(var i=0; i<this.length; i++) { 
    var item = this[i]; 
    if(eval("item" + query)) { 
     newArray.push(item); 
    } 
} 
return newArray; 
}; 

,并与任何阵列使用它,通过作为查询字符串

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