我有一个像这样的数组:
var anArray = [
{ name: "scala", type: "a" },
{ name: "abc", type: "b" },
{ name: "test", type: "a" },
{ name: "ruby", type: "c" },
{ name: "erlang", type: "a" },
];
我想根据项目属性查找项目。我目前使用 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" }]
这样做的优点和缺点:如果底层数据没有以废弃缓存的方式更改,那么访问以前执行的搜索会非常快。另一方面,这意味着您必须控制数据访问(在这些情况下,我喜欢将数据存储在闭包内,这样我只需公开更改器(mutator) - 有点轻量级 OO,但具有更多保护),并且您可能会发现在修改缓存数据时丢弃它比尝试计算增量的性能更高,具体取决于数据的结构。
不过,我要强调的是,绝对确保您确实需要任何优化。这一段够快吗?您可以通过其他方式加快您的应用程序的速度吗?如果您正在编写客户端搜索引擎或其他东西,您可能会想要更深入地研究它,而不仅仅是找出哪个 jQuery 迭代器最快。
关于javascript - 根据项目属性值在数组中查找某些项目的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913672/