Javascript 查找最近的数组索引

Javascript 查找最近的数组索引,javascript,arrays,json,ajax,associative-array,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}; MyEv

我正在处理一个“事件”数组,其中数组的键是事件的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,来自另一个源,我想找到当时发生的事件……很容易,我只需要从具有给定索引的数组中获取元素(上面列表中的第二个)。 现在的问题是:immagine没有找到给定的索引(假设我们正在寻找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]获取第一个元素,尽管我们不知道键值。就内存而言,这种方法更昂贵(这里我们必须保存索引和键),还是编译器的效果相同?

您可以使用
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”]


参考资料:

MyEventsArray[1513957775]和MyEventsArray['1513957775']之间没有区别。实际上,数组索引只是属性名,而属性名是字符串

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

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

var MyEventsArray=[];
MyEventsArray[1513957775]={lat:40.671978333,lng:14.778661666667,事件代码:46};
MyEventsArray[1513957845]={lat:40.67456833333,lng:14.568661645667,事件代码:23};
MyEventsArray[1513957932]={lat:41.67456832333,lng:13.568661645667,事件代码:133};
var目标=1513957855;
var最近=Object.keys(MyEventsArray)
.map(k=>({k,delta:Math.abs(target-k)}))
.sort((a,b)=>a.delta-b.delta)[0].k;
控制台日志(最近)如果增量大于上一个增量,您可以选择退出迭代的允许值

var数组=[];
数组[1513957775]={lat:40.671978333,lng:14.778661666667,事件代码:46};
数组[1513957845]={lat:40.67456833333,lng:14.568661645667,事件代码:23};
数组[1513957932]={lat:41.67456832333,lng:13.568661645667,事件代码:133};
var key=0,
搜索=1513957855;
key(数组).some(函数(k){
if(Math.abs(k-search)>Math.abs(key-search)){
返回true;
}
key=k;
});

控制台日志(键)
Nice-然后您可以对该键数组
.map
添加第二个属性到由键数组值和搜索值之间的绝对差组成的每个条目。。然后,通过抓取第一个条目的差值对返回的映射数组进行排序。。我喜欢这个
Object.keys(MyEventsArray)
。出色的解决方案,我低估了Object.keys().map。这正是我要找的。
对象。键
不能保证以任何特定顺序返回键,因此此优化依赖于实现细节。@JLRishe,在至少有ES2015标准的较新系统中,整数属性优先排序,因此无需排序,因为你得到了正确的迭代顺序。一个更快的方法可能是使用二进制搜索。谢谢。我没有意识到他们在ES2015中对其进行了标准化。