gpt4 book ai didi

javascript - 如果键不存在,如何在关联的 JavaScript 数组中获取最近的键索引?

转载 作者:行者123 更新时间:2023-11-30 18:49:17 25 4
gpt4 key购买 nike

所以,尝试做这件事可能很奇怪,但我很好奇这是否可能:

假设我有一个这样的关联数组:

myarray[50] = 'test1'  
myarray[100] = 'test2'

当然,我可以通过它的 key 访问'test1':

myarray[50]; // returns 'test1'

但是有没有一种方法,如果我有一个索引键“60”,我可以在数组中查找,如果键 60 不存在,则获取值下一个“最接近”的键,“50”?

这个用例是我正在尝试为视频设置提示点,如果用户寻找并错过了一个提示点,我想显示用户寻找的最后一个提示点的信息.

我想我可以使用“in”运算符检查 key 是否存在。但是如果没有找到,我怎样才能得到确实存在的“上一个”或“下一个最小的”数组键?

我假设这样做的唯一方法是遍历数组,保存“最后”索引值,直到找到“index > myKey”的退出条件。问题是,如果它是一个有很多队列点的长视频,并且用户经常搜索,那么每次遍历整个提示点数组可能会很慢。有没有更好、更快的方法来做到这一点?

最佳答案

您必须编写自己的函数:

function getClosestTo(val, array) {
if (array[val] !== undefined) {
return val;
} else {
var upper = val;
var upperMatched = false;
var lower = val;
var lowerMatched = false;

while(upper < this.length) {
if (array[++upper] !== undefined) {
upperMatched = true;
break;
};
};

while(lower > -1) {
if (array[--lower] !== undefined) {
lowerMatched = true;
break;
};
};

if (upperMatched && lowerMatched) {
return upper - val < val - lower ? upper : lower;
} else if (upperMatched) {
return upper;
} else if (lowerMatched) {
return lower;
};
};

return -1;
};

您还可以将其添加为 Array 原型(prototype)的方法,以使(我认为的)更具可读性:

Array.prototype.getClosestTo = function (val) {
if (this[val] !== undefined) {
return val;
} else {
var upper = val;
var upperMatched = false;
var lower = val;
var lowerMatched = false;

while(upper < this.length) {
if (this[++upper] !== undefined) {
upperMatched = true;
break;
};
};

while(lower > -1) {
if (this[--upper] !== undefined) {
lowerMatched = true;
break;
};
};

if (upperMatched && lowerMatched) {
return upper - val < val - lower ? upper : lower;
} else if (upperMatched) {
return upper;
} else if (lowerMatched) {
return lower;
};
};

return -1;
};

// Usage:
// var closestKey = theArray.getClosestTo(50);

关于javascript - 如果键不存在,如何在关联的 JavaScript 数组中获取最近的键索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4443632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com