我有以下示例客户端对象:
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!');
}
}
是否有更有效的方法来执行此操作,因为为每个新位置迭代对象似乎效率低下?
<小时/>编辑:我的解决方案:
我决定将位置对象转换为字符串,然后评估每个传入的字符串:
var test = -121.60183 + ',' + 38.025783;
var cords = [].concat([], obj.locations).toString();
if( cords.indexOf(test) !== -1) {
console.log('found! ');
}
最佳答案
这可能是计算机科学中最古老的问题之一——查找一些东西。
你首先要问自己这是否值得担心。使用线性搜索可能需要 1 毫秒才能找到位置,但使用某种优化搜索则需要 0.5 毫秒。那么,值得这么麻烦吗?
下一个方法是对位置列表进行排序,并对其进行二分搜索。
另一种方法是创建某种哈希表。为此,您可以使用 JavaScript 对象,并将属性作为哈希键。最简单的方法是使用lat+long
作为属性键,但现在您只是将效率问题转移到JS在大对象中查找键的效率上。
您可以设计自己的自定义散列式方法,其中具有相同纬度整数部分的所有位置都存储为散列值 37 下的数组。然后,性能由在表,然后查看其数组中较少数量的位置。
更进一步,如果性能确实是一个问题,您可以构建某种树结构以实现最佳查找。在某些时候,您必须开始在构建和更新树的成本与使用树查找内容所节省的成本之间进行权衡。
关于javascript - 有效评估 JavaScript 对象是否包含字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25703367/