【问题标题】:How to get nearest key index in associative JavaScript array if key does not exist?如果键不存在,如何在关联 JavaScript 数组中获取最近的键索引?
【发布时间】:2011-05-25 12:35:31
【问题描述】:

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

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

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

我当然可以通过密钥访问'test1'

myarray[50]; // returns 'test1'

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

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

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

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

【问题讨论】:

    标签: javascript arrays hashtable associative-array


    【解决方案1】:

    您必须编写自己的函数:

    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 原型的方法,以使(我认为)更具可读性:

    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 原型中,但那样会很漂亮!
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多