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查询: