有效评估JavaScript对象是否包含字符串

Efficiently evaluate if JavaScript object contains a string

本文关键字:包含 字符串 是否 对象 评估 JavaScript 有效      更新时间:2023-09-26

我有以下客户端对象示例:

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 {

显然,您需要注意从"真实"数组和"索引"中添加新位置(并删除已删除的位置)。