有效评估JavaScript对象是否包含字符串
Efficiently evaluate if JavaScript object contains a string
我有以下客户端对象示例:
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! ');
}
这可能是计算机科学中最古老的问题之一——查找。
你首先必须问问自己,这是否值得担心。线性搜索可能需要1ms才能找到位置,但某种优化搜索需要0.5ms。那么,麻烦值得吗?
下一种方法是对位置列表进行排序,并对其进行二进制搜索
另一种方法是创建某种哈希表。您可以使用JavaScript对象,将属性作为散列键。最简单的方法是使用lat+long
作为属性键,但现在您刚刚将效率问题转移到JS在大型对象中查找键的效率上。
您可以设计自己的类似散列的自定义方法,其中具有相同纬度整数部分的所有位置都存储为散列为37的数组。然后,性能取决于在表中查找哈希键所花费的时间,然后在其数组中查找较少的位置。
进一步说,如果性能确实是一个问题,您可以构建某种树结构来实现最佳查找。在某个时候,你必须开始在构建和更新树的成本和使用树查找东西所节省的成本之间进行权衡。
它肯定效率低下,但除非你必须处理成千上万的对象,否则它不会挂起你的浏览器。
但是,可以对关联阵列中的位置进行索引,然后使用索引来检查是否存在图元。
例如,您可以将locations_index对象添加到您的对象中,如下所示:
var obj={"位置":[[37.502917,-122.501335],[37.494473,-122.499619],[37.484394,-122.455673]],"locations_index":{"37.502917,-122.501335":正确,"37.494473,-122.499619":正确,//。。。},"类型":[[
然后你可以用检查它是否在location_index中
if (obj.locations_index["37.502917,-122.501335"]) {
// It's already there
} else {
显然,您需要注意从"真实"数组和"索引"中添加新位置(并删除已删除的位置)。
- 如何使用JQuery在HTML中创建包含字符串参数的引号的onclickjavascript链接
- 如何在系列数据中包含字符串以提取工具提示点格式
- lodash_.包含字符串中多个值之一
- 使用video-js构建一个包含字符串的HTML视频
- 如何检查数据表是否有任何包含字符串的行并获取它的行索引
- 如何从包含字符串的对象中删除引号
- 检查上一个(-1&-2)url是否包含字符串
- 如果字符串保存在变量中,如何查找包含字符串的ID
- jQuery检查URL是否包含字符串
- 如果URL包含字符串don't运行jQuery函数
- 谷歌脚本如果文件名包含x字符串日志“;x被发现“;缺少括号
- 检查值是否包含字符串字符
- 如果不包含字符串,则使用 jQuery 在下拉列表中选择空值
- 根据包含字符串的值选择<选择> <选项>
- AngularJS - 如果包含字符串,则删除ng重复项
- 检查身份验证对话框中的领域是否包含字符串
- 根据对象中的值是否包含字符串来删除该值
- 重定向 挖空 如果包含字符串,则可观察到
- 从数组中提取索引,该数组包含字符串中的每个单词
- 在 JW 播放器开始之前不显示图像,如果 URL 包含字符串 base64