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

时间:2014-09-06 18:17:34

标签: javascript arrays object evaluation

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

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

2 个答案:

答案 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的散列形式存储为数组。然后,性能由查找哈希键所用的时间来控制。该表,然后查看其数组中较少数量的位置。

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

相关问题