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

标签 javascript arrays hashtable associative-array

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

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

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/

相关文章:

javascript - substr() 没有像预期的那样连接字符串 javascript

javascript - php、mysql 和 ajax : dynamically display default data, 选择现有的,或添加新的

python - 迭代 python 集中的单个元素

c# - 元组(或数组)作为 C# 中的字典键

javascript - 如何使我的网站在移动设备上的 View 尺寸更小以适合移动设备屏幕

javascript - 如何使用正则表达式仅匹配第一行?

javascript - 在 JavaScript 中使用 for 循环创建对象数组

javascript - 将数组存储到 Cookie Jquery

c++ - 在 C++ 中返回具有常量值的矩阵

java - 在 Java 中获取哈希表中的键的索引