我有一个这样的数组:
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中有更好的方法吗?还是有一些算法可以更快更好地完成这项工作?当数组有很多项。这可能很慢。有任何想法吗?感谢。
答案 0 :(得分:2)
更聪明的头脑可能会纠正我,但我认为你将不得不每次都要迭代(以或多或少相似的速度),除非:
您知道您将重复搜索,并且某些密钥比其他密钥更有可能被搜索。您可能会偏向该集合,因此它不是平坦的,而是根据您的条款进行预先排序。因此,您的收藏将成为:
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" }]
优点和缺点:如果底层数据没有以弃用缓存的方式更改,则访问以前执行的搜索速度非常快。另一方面,这意味着你必须控制数据访问(我喜欢在这些情况下将我的数据存储在一个闭包中,所以我只需要暴露mutators - 一种轻量级的OO,但有更多的保护),而你可能会发现在修改数据时修改缓存数据比尝试计算增量更高效,具体取决于数据的结构。
我要强调的是,除了其他一切之外,还要确保你完全需要任何优化。这个小节足够快吗?你能以另一种方式加速你的应用吗?如果您正在编写客户端搜索引擎或其他东西,那么您可能希望进一步了解它,而不仅仅是确定哪个jQuery迭代器最快。
答案 1 :(得分:1)
您可以使用此javascript lib,DefiantJS(http://defiantjs.com),您可以使用它在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
这是一个工作小提琴:
http://jsfiddle.net/hbi99/wM98Y/4/
DefiantJS使用方法“search”扩展全局对象,并返回一个匹配的数组(如果没有找到匹配则返回空数组)。您可以在此处使用XPath Evaluator尝试lib和XPath查询: