查找最近的数组索引

问题描述 投票:3回答:3

我正在处理一系列“事件”,其中数组的键是事件的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]获得第一个元素。这种方法在内存方面是否更加昂贵(这里我们必须保存索引和密钥),或者编译器的效果是否相同?

javascript arrays json ajax associative-array
3个回答
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
投票

您可以使用qazxsw poi,如果增量大于最后一个增量,则允许退出迭代。


0
投票

您可以使用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);来获取键的数组(奇怪地表示为字符串);然后你可以迭代它并找到最接近的匹配。

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"]

© www.soinside.com 2019 - 2024. All rights reserved.