Как получить индекс ближайшего ключа в ассоциативном массиве JavaScript, если ключ не существует? - PullRequest
1 голос
/ 14 декабря 2010

Итак, это может быть странная вещь, чтобы попытаться сделать, но мне любопытно, если это возможно:

Скажем, у меня есть ассоциативный массив, подобный этому:

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

Iможет получить доступ к 'test1' по его ключу, конечно:

myarray[50]; // returns 'test1'

Но есть ли способ, где, если у меня есть индексный ключ '60', я могу посмотреть в массиве, и еслиключ 60 не там, получите значение следующего «ближайшего» ключа, «50»?

Вариант использования этого заключается в том, что я пытаюсь установитьдо ключевых точек для видео, и если пользователь ищет и пропускает ключевую точку, я хочу отобразить информацию из последней ключевой точки, которую пользователь искал за пределами.

Я думаю, что могу проверить наличиеключ с оператором «в».Но если он не найден, как я могу получить «предыдущий» или «следующий наименьший» ключ массива, который существует?

Я предполагаю, что единственный способ сделать это - перебрать массив, сохранив «последний».msgstr "значение индекса, пока не будет найдено условие выхода" index> myKey ".Дело в том, что если это длинное видео с большим количеством точек очереди и пользователь часто ищет, то итерация по всему массиву ключевых точек каждый раз может быть медленной.Есть ли лучший, более быстрый способ сделать это?

1 Ответ

2 голосов
/ 14 декабря 2010

Вы должны написать свою собственную функцию:

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);
...