查找最近的数组索引

时间:2017-12-22 18:48:24

标签: javascript arrays json ajax associative-array

我正在处理一系列" 事件"数组的是事件的 Unix时间戳。换句话说,让我们假设我们在 JS 中有以下事件对象数组:

var MyEventsArray=[];
MyEventsArray[1513957775]={lat:40.671978333333, lng:14.778661666667, eventcode:46};
MyEventsArray[1513957845]={lat:40.674568332333, lng:14.568661645667, eventcode:23};
MyEventsArray[1513957932]={lat:41.674568332333, lng:13.568661645667, eventcode:133};
and so on for thousands rows...

数据沿 Ajax 调用发送,并在 JSON 中编码,以便用 JS 进行处理。当收到数据集时,我有另一个Unix时间戳,比如1513957845,来自另一个来源,我想找到当时发生的事件......这很简单,我只需要从中获取元素具有给定索引的数组(上面列表中的第二个)。 现在的问题是:想象找不到给定的索引(想象一下我们正在寻找UXTimestamp = 1513957855)并且该索引不存在于数组中但我想采用最接近的索引(在上面的示例我将采用元素MyEventsArray [1513957845],因为它的索引1513957845最接近1513957855)。我该怎么做才能获得这个结果? 我的困难在于处理数组索引,因为当我收到数组时,我不知道索引的开始位置。

机器如何处理这种情况? 机器是否会为每行之间放置的虚拟/空元素分配(和浪费)内存,或者编译器是否有某种能力来构建它自己的索引并优化空间?换句话说:我们正在做索引是否安全,或者将数组分配为:

var MyEventsArray=[];
MyEventsArray['1513957775']={lat:40.671978333333, lng:14.778661666667, eventcode:46};
MyEventsArray['1513957845']={lat:40.674568332333, lng:14.568661645667, eventcode:23};
MyEventsArray['1513957932']={lat:41.674568332333, lng:13.568661645667, eventcode:133};
and so on for thousands rows...

在这种情况下,键和索引明显不同,所以尽管我们不知道键值,但可以使用MyArray [0]获得第一个元素。这种方法在内存方面是否更加昂贵(这里我们必须保存索引和密钥),或者编译器的效果是否相同?

3 个答案:

答案 0 :(得分:3)

MyEventsArray[1513957775]MyEventsArray['1513957775']之间没有区别。在内心深处,数组索引只是属性名称,属性名称是字符串。

关于这些稀疏指数是否会导致分配数百万个空单元的问题,不,这不会发生。稀疏数组只存储放在其中的内容,而不是空白空间。

如果您想快速找到密钥,可以获取密钥数组,对其进行排序,然后找到您想要的密钥:



var MyEventsArray=[];
MyEventsArray[1513957775]={lat:40.671978333333, lng:14.778661666667, eventcode:46};
MyEventsArray[1513957845]={lat:40.674568332333, lng:14.568661645667, eventcode:23};
MyEventsArray[1513957932]={lat:41.674568332333, lng:13.568661645667, eventcode:133};

var target = 1513957855;

var closest= Object.keys(MyEventsArray)
                   .map(k => ({ k, delta: Math.abs(target - k) }))  
                   .sort((a, b) => a.delta - b.delta)[0].k;

console.log(closest);




答案 1 :(得分:1)

如果增量大于最后一个增量,您可以使用允许退出迭代的Array#some

var array = [];
array[1513957775] = { lat: 40.671978333333, lng: 14.778661666667, eventcode: 46 };
array[1513957845] = { lat: 40.674568332333, lng: 14.568661645667, eventcode: 23 };
array[1513957932] = { lat: 41.674568332333, lng: 13.568661645667, eventcode: 133 };

var key = 0,
    search = 1513957855;

Object.keys(array).some(function (k) {
    if (Math.abs(k - search) > Math.abs(key - search)) {
        return true;
    }
    key = k;
});

console.log(key);

答案 2 :(得分:0)

您可以使用Object.keys(MyEventsArray)来获取键的数组(奇怪地表示为字符串);然后你可以迭代它并找到最接近的匹配。

var MyEventsArray=[];
MyEventsArray[1513957775]={lat:40.671978333333, lng:14.778661666667, eventcode:46};
MyEventsArray[1513957845]={lat:40.674568332333, lng:14.568661645667, eventcode:23};
MyEventsArray[1513957932]={lat:41.674568332333, lng:13.568661645667, eventcode:133};
Object.keys(MyEventsArray)
  

["1513957775", "1513957845", "1513957932"]

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array