Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果键不存在,如何在关联JavaScript数组中获取最近的键索引?_Javascript_Arrays_Hashtable_Associative Array - Fatal编程技术网

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

如果键不存在,如何在关联JavaScript数组中获取最近的键索引?,javascript,arrays,hashtable,associative-array,Javascript,Arrays,Hashtable,Associative Array,所以,这可能是一件奇怪的事情,但我很好奇这是否可能: 假设我有这样一个关联数组: myarray[50] = 'test1' myarray[100] = 'test2' 我可以通过它的键访问'test1',当然: myarray[50]; // returns 'test1' 但是有没有一种方法,如果我有一个索引键'60',我可以在数组中查找,如果键60不在数组中,可以得到下一个“最近”键'50'的值? 这样做的用例是,我正在尝试为视频设置提示点,如果用户寻找并错过了一个提示点,我希望

所以,这可能是一件奇怪的事情,但我很好奇这是否可能:

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

myarray[50] = 'test1'  
myarray[100] = 'test2'
我可以通过它的键访问
'test1'
,当然:

myarray[50]; // returns 'test1'
但是有没有一种方法,如果我有一个索引键'60',我可以在数组中查找,如果键60不在数组中,可以得到下一个“最近”键'50'的值?

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

我想我可以用“in”操作符检查密钥的存在。但是,如果找不到,如何获取确实存在的“上一个”或“下一个最小”数组键


我假设唯一的方法是遍历数组,保存“last”索引值,直到找到“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;
};
函数getClosestTo(val,数组){ if(数组[val]!==未定义){ 返回val; }否则{ var上限=val; var-upperMatched=false; var下限=val; var lowerMatched=假; while(上部<此长度){ if(数组[++上限]!==未定义){ upperMatched=true; 打破 }; }; 而(下>-1){ if(数组[--lower]!==未定义){ lowerMatched=真; 打破 }; }; 如果(上匹配和下匹配){ 返回上限-val 您还可以将其添加为阵列原型的一种方法,以使(我认为)更具可读性:

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);
Array.prototype.getClosestTo=函数(val){
如果(此[val]!==未定义){
返回val;
}否则{
var上限=val;
var-upperMatched=false;
var下限=val;
var lowerMatched=假;
while(上部<此长度){
如果(此[++上限]!==未定义){
upperMatched=true;
打破
};
};
而(下>-1){
if(此[--上限]!==未定义){
lowerMatched=真;
打破
};
};
如果(上匹配和下匹配){
返回上限-val
正是我所怀疑的,但谢谢你的提示!我不会想到把它放在阵列原型中,但那样会很光滑!