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