我正在处理一系列“事件”,其中数组的键是事件的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]获得第一个元素。这种方法在内存方面是否更加昂贵(这里我们必须保存索引和密钥),或者编译器的效果是否相同?
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);
您可以使用qazxsw poi,如果增量大于最后一个增量,则允许退出迭代。
您可以使用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"]