Javascript 基于项属性值在数组中查找某些项的最佳方法是什么?

Javascript 基于项属性值在数组中查找某些项的最佳方法是什么?,javascript,json,search,Javascript,Json,Search,我有这样一个数组: var anArray = [ { name: "scala", type: "a" }, { name: "abc", type: "b" }, { name: "test", type: "a" }, { name: "ruby", type: "c" }, { name: "erlang", type: "a" }, ]; 我想根据item属性查找项目。我目前使用jQuery来完成这项工作。像这样的东西 Arra

我有这样一个数组:

var anArray = [
    { name: "scala",  type: "a" },
    { name: "abc",    type: "b" },
    { name: "test",   type: "a" },
    { name: "ruby",   type: "c" },
    { name: "erlang", type: "a" },
];
我想根据item属性查找项目。我目前使用jQuery来完成这项工作。像这样的东西

Array.prototype.find_by_key = function(key, value) {
    return $.grep(this, function(item){
        return (item[key] == value);
    });
}

var whatIHaveFound = anArray.find_by_key("type", "a"); // find items which the item property: "type" equals "a"

有没有更好的方法在javascript中实现这一点?或者有什么算法可以更快更好地实现这一点?当数组中有许多项时。这可能非常缓慢。有什么想法吗?谢谢。

聪明的头脑可能会纠正我的错误,但我认为你每次都必须迭代(速度差不多),除非:

您知道您将重复搜索,并且某些键比其他键更有可能被搜索。然后,您可能会对集合进行偏移,使其不是扁平的,而是根据您的条件进行预排序。因此,您的收藏将成为:

var groupedByType = 
{"a":[{name:"scala"},{name:"test"}, {name:"erlang"}],  
{"b":[{name:"abc"}],  
{"c":[{name:"ruby"}]};  
或者,您可以尝试记录您的收藏访问权限,这样,在完成搜索后,您可以记录搜索词和结果,在本例中,将其存储在备忘录缓存中作为

["type","a"]:[
{ name: "scala",  type: "a" },  
{ name: "test",   type: "a" },  
{ name: "erlang", type: "a" }]
优点和缺点:如果底层数据没有以不利于缓存的方式更改,那么访问以前执行的搜索会非常快。另一方面,这意味着您必须控制数据访问(在这些情况下,我喜欢将数据存储在闭包中,这样我只需公开变异子——有点轻量的OO,但有更多的保护),您可能会发现,在修改缓存数据时丢弃缓存数据比尝试计算增量更有效,取决于数据的结构


不过,我要强调的是,绝对确保您需要任何优化。这个分段足够快吗?你能用另一种方式提高你的应用程序的速度吗?如果您正在编写客户端搜索引擎或其他东西,您可能会想更深入地了解它,而不仅仅是找出哪个jQuery迭代器最快。

您可以使用这个javascript库,即DefiantJS(),使用它可以在JSON结构上使用XPath筛选匹配项。要将其放入JS代码中:

var anArray = [
    { name: "scala",  type: "a" },
    { name: "abc",    type: "b" },
    { name: "test",   type: "a" },
    { name: "ruby",   type: "c" },
    { name: "erlang", type: "a" },
];.
res = JSON.search( anArray, '//*[type="a"]' );

console.log( res[0].name );
// scala

console.log( res.length );
// 3
这是一把小提琴:

DefiantJS使用方法“search”扩展全局对象,并返回一个包含匹配项的数组(如果未找到匹配项,则返回空数组)。您可以在此处使用XPath计算器尝试lib和XPath查询: