我有以下示例客户端对象:
var obj = {
"locations": [
[
37.502917,
-122.501335
],
[
37.494473,
-122.499619
],
[
37.484394,
-122.455673
]
],
"types": [
[
"type1"
],
[
"type2"
],
[
"type3"
]
]
};
地点最多可包含50个值。 ajax请求返回一组新位置,我需要评估它们是否已经在obj.locations中。每个新返回的位置都是一个字符串,例如:
var test = 37.502917 + ',' + -122.501335;
对于每个位置,我可以遍历当前位置并检查它是否存在:
for(var i = 0; i < obj.locations.length; i++) {
if(obj.locations[i] == test){
console.log('Found!');
}
}
有没有更有效的方法来执行此操作,因为为每个新位置迭代对象似乎效率低下?
编辑:我的解决方案:
我决定使用locations对象并转入一个字符串,然后评估每个传入的字符串:
var test = -121.60183 + ',' + 38.025783;
var cords = [].concat([], obj.locations).toString();
if( cords.indexOf(test) !== -1) {
console.log('found! ');
}
答案 0 :(得分:1)
这肯定是低效的,但除非您必须处理数以千计的这些对象,否则它不会挂起您的浏览器。
但是,您可以索引关联数组中的位置,然后使用它来检查元素的存在与否。
例如,您可以向对象添加locations_index对象,如下所示:
var obj = { "locations": [ [ 37.502917, -122.501335 ], [ 37.494473, -122.499619 ], [ 37.484394, -122.455673 ] ], "locations_index" : { "37.502917,-122.501335" : true, "37.494473,-122.499619" : true, // ... }, "types": [ [
然后你可以在location_index中检查它是否是:
if (obj.locations_index["37.502917,-122.501335"]) {
// It's already there
} else {
显然,你需要注意从“真实”数组和“索引”中添加新位置(并删除你删除的位置)。
答案 1 :(得分:1)
这可能是计算机科学中最古老的问题之一 - 正在寻找一些东西。
你首先要问自己是否值得担心。也许通过线性搜索找到位置需要1ms,但是使用某种优化搜索需要0.5ms。那么,这值得吗?
下一种方法是对位置列表进行排序,并对其进行二进制搜索。
另一种方法是创建某种哈希表。您可以使用JavaScript对象,将属性作为哈希键。最简单的方法是使用lat+long
作为属性键,但现在你只是将效率问题转移到JS在大对象中查找键的效率。
您可以设计自己的自定义类哈希方法,其中具有相同整数部分纬度的所有位置都以37的散列形式存储为数组。然后,性能由查找哈希键所用的时间来控制。该表,然后查看其数组中较少数量的位置。
进一步说,如果性能确实是一个问题,您可以构建某种树结构以实现最佳查找。在某些时候,您必须开始在构建和更新树的成本之间进行权衡,以及使用树查找内容所带来的节省。