【问题标题】:Efficiently evaluate if JavaScript object contains a string有效评估 JavaScript 对象是否包含字符串
【发布时间】:2014-09-06 18:17:33
【问题描述】:

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

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!  ');
}

【问题讨论】:

  • 在您的迭代中,您将数组与字符串进行比较。但即使是数组,你也不能只用 "==": [5, 5] == [5, 5] // false!
  • ajax 请求返回的确切格式是什么?
  • @dsuckau:实际上你可以比较数组和字符串,它甚至可以工作:"5,5" == [5,5] // true。当然你是对的,这不是应该的。

标签: javascript arrays object evaluation


【解决方案1】:

这可能是计算机科学中最古老的问题之一——查找。

您首先必须问自己是否值得担心。使用线性搜索可能需要 1 毫秒才能找到位置,但使用某种优化搜索需要 0.5 毫秒。那么,这值得麻烦吗?

下一个方法是对位置列表进行排序,然后对其进行二分搜索。

另一种方法是创建某种哈希表。您可以为此使用 JavaScript 对象,并将属性作为哈希键。最简单的方法是使用lat+long 作为属性键,但现在您只是将效率问题转移到 JS 在大对象中查找键的效率上。

您可以设计自己的自定义类似散列的方法,其中具有相同纬度整数部分的所有位置都存储为散列 37 下的数组。然后性能取决于在其中找到散列键所需的时间表格,然后查看其数组中较少数量的位置。

进一步,如果性能确实是一个问题,您可以构建某种树结构以获得最佳查找。在某些时候,您必须开始在构建和更新树的成本与使用树查找内容所节省的成本之间进行权衡。

【讨论】:

    【解决方案2】:

    这肯定是低效的,但除非您必须处理数千个这样的对象,否则它不会挂起您的浏览器。

    但是,您可以索引关联数组中的位置,然后使用它来检查元素是否存在。

    例如,您可以将 locations_index 对象添加到您的对象中,如下所示:

    变量 obj = { “地点”:[ [ 37.502917, -122.501335 ], [ 37.494473, -122.499619 ], [ 37.484394, -122.455673 ] ], “位置索引”:{ “37.502917,-122.501335”:是的, “37.494473,-122.499619”:是的, // ... }, “类型”:[ [

    然后你可以检查它是否在 location_index 中:

    if (obj.locations_index["37.502917,-122.501335"]) {
      // It's already there
    } else {
    

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

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 2022-11-17
      • 2012-12-17
      • 1970-01-01
      • 2014-06-21
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      相关资源
      最近更新 更多