Есть ли какой-либо хороший хеш JavaScript (код/таблица) реализация там?

Если вы не хотите, чтобы кнопка или какой-либо элемент в вашей форме выполнялся нажатием клавиши TAB, просто добавьте this.MyButton.TabStop = false; в свой конструктор этой конкретной формы. Все, что он делает, это отключает (в данном случае «MyButton») выбор, нажимая TAB. Я надеюсь, что это решит вашу проблему.

6
задан Luigi 23 April 2014 в 06:14
поделиться

4 ответа

В JavaScript объекты являются буквально реализацией хеша. Java HashMap будет чем-то вроде фальшивки, таким образом, я бросил бы вызов Вам заново продумать свои потребности.

Прямой ответ не, я не полагаю, что существует большая реализация HashMap Java в JavaScript. Если существует, это обязано быть частью библиотеки, что Вы можете или не можете хотеть использовать, и Вы, конечно, не должны включать библиотеку только, чтобы иметь немного хеш-таблицы.

Поэтому давайте идти вперед и давайте запишем один, только исследуем проблему. Можно использовать его, если Вам нравится. Мы только запустим путем записи конструктору, и мы осуществим контрейлерные перевозки прочь Массива, который является Объектом, но имеет некоторые полезные методы, которые помешают этому примеру становиться слишком утомительным:

function HashMap () {
    var obj = [];
    return obj;
}

var myHashMap = HashMap();

Мы добавим некоторые методы прямо от мира Java, но переведем в JavaScript, когда мы идем...

function HashMap() {
    var obj = [];
    obj.size = function () {
        return this.length;
    };
    obj.isEmpty = function () {
        return this.length === 0;
    };
    obj.containsKey = function (key) {
        for (var i = 0; i < this.length; i++) {
            if (this[i].key === key) {
                return i;
            }
        }
        return -1;
    };
    obj.get = function (key) {
        var index = this.containsKey(key);
        if (index > -1) {
            return this[index].value;
        }
    };
    obj.put = function (key, value) {
        if (this.containsKey(key) !== -1) {
            return this.get(key);
        }
        this.push({'key': key, 'value': value});
    };
    obj.clear = function () {
        this = null;  // Just kidding...
    };
    return obj;
}

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

Немного нелепо, что одной из вещей, которая делает JavaScript таким интересным и разнообразным языком, является простота, с которой это обрабатывает этот вид борьбы. Мы можем буквально сделать что-либо, что мы хотели бы, и быстрый пример здесь ничего не делает, если он не иллюстрирует обманчивое питание языка. Все же, учитывая, что питание, кажется лучше не использовать его.

Я просто думаю, что JavaScript хочет быть легче. Моя персональная рекомендация состоит в том, что Вы вновь исследуете проблему перед попыткой, реализуют надлежащий Java HashMap. JavaScript не хочет и не предоставляет для одного.

Помните собственную альтернативу:

var map = [{}, 'string', 4, {}];

.. настолько быстрый и легкий для сравнения.

С другой стороны, я не полагаю, что существуют любые твердые ответы здесь. Эта реализация действительно может быть совершенно приемлемым решением. Если бы Вы чувствуете, что можно использовать его, я сказал бы, дают ему водоворот. Но я никогда не использовал бы его, если бы я чувствовал, что у нас есть обоснованно более простые и более естественные средства в нашем распоряжении.. который я почти уверен, что мы делаем.

Заметка на полях: эффективность связана со стилем? Заметьте хит производительности.. существует большой O бросающийся в глаза нам в HashMap.put ()... Меньше оптимальная производительность, вероятно, не является выставочным стопором здесь, и необходимо было бы, вероятно, делать что-то очень амбициозное или иметь большой набор данных, прежде чем Вы даже заметили бы отклонение производительности современный браузер. Просто интересно отметить, что операции имеют тенденцию становиться менее эффективными, когда Вы работаете против мелкой частицы, почти как будто существует естественная энтропия на работе. JavaScript является высокоуровневым языком и должен предложить эффективные решения, когда мы следуем его конвенциям, так же, как HashMap в Java будет намного более естественным и высокопроизводительным выбором.

23
ответ дан 8 December 2019 в 03:02
поделиться

Обратите внимание, что наборы Java с помощью "любой вид объекта" как ключ не совершенно правильны. Да, можно использовать любой объект, но если тот объект не будет иметь хороший хэш-код () и равняется () реализациям затем, он не будет работать хорошо. Класс базового объекта имеет реализацию по умолчанию для них, но чтобы пользовательские классы работали (эффективно) ключами хеш-таблицы, необходимо переопределить их. JavaScript не имеет никакого эквивалента (что я знаю о).

Создать хеш-таблицу в JavaScript, который может (эффективно) использовать произвольные объекты в качестве ключа, необходимо было бы осуществить что-то подобное на объектах, которые Вы используете, по крайней мере, если Вы хотите сохранить увеличение производительности хеш-таблицы. Если можно осуществить 'хэш-код ()' метод, который возвращает Строку, то можно просто использовать Объект под капотом как фактическая хеш-таблица.

Иначе Вы должны были бы так что-то как другие отправленные решения, которые с прямо сейчас не работают как хеш-таблицы. Они оба делают O (n) поиски по списку, чтобы попытаться найти ключ, который в значительной степени побеждает цель хеш-таблицы (хеш-таблицы являются обычно постоянным временем для, получают/помещают).

1
ответ дан 8 December 2019 в 03:02
поделиться

Вот наивная реализация, которую я просто соединил - как keparo упомянутый в комментарии, одной из больших проблем является проверка равенства:

var ObjectMap = function()
{
    this._keys = [];
    this._values = [];
};

ObjectMap.prototype.clear = function()
{
    this._keys = [];
    this._values = [];
};

ObjectMap.prototype.get = function(key)
{
    var index = this._indexOf(key, this._keys);
    if (index != -1)
    {
        return this._values[index];
    }
    return undefined;
};

ObjectMap.prototype.hasKey = function(key)
{
    return (this._indexOf(key, this._keys) != -1);
};

ObjectMap.prototype.hasValue = function(value)
{
    return (this._indexOf(value, this._values) != -1);
};

ObjectMap.prototype.put = function(key, value)
{
    var index = this._indexOf(key, this._keys);
    if (index == -1)
    {
        index = this._keys.length;
    }

    this._keys[index] = key;
    this._values[index] = value;
};

ObjectMap.prototype.remove = function(key)
{
    var index = this._indexOf(key, this._keys);
    if (index != -1)
    {
        this._keys.splice(index, 1);
        this._values.splice(index, 1);
    }
};

ObjectMap.prototype.size = function()
{
    return this._keys.length;
};

ObjectMap.prototype._indexOf = function(item, list)
{
    for (var i = 0, l = list.length; i < l; i++)
    {
        if (this._equals(list[i], item))
        {
            return i;
        }
    }
    return -1;
};

ObjectMap.prototype._equals = function(a, b)
{
    if (a === b)
    {
        return true;
    }

    // Custom objects can implement an equals method
    if (typeof a.equals == "function" &&
        typeof b.equals == "function")
    {
        return a.equals(b);
    }

    // Arrays are equal if they're the same length and their contents are equal
    if (a instanceof Array && b instanceof Array)
    {
        if (a.length != b.length)
        {
            return false;
        }

        for (var i = 0, l = a.length; i < l; i++)
        {
            if (!this._equals(a[i], b[i]))
            {
                return false;
            }
        }

        return true;
    }

    // Checking object properties - objects are equal if they have all the same
    // properties and they're all equal.
    var seenProperties = {};
    for (var prop in a)
    {
        if (a.hasOwnProperty(prop))
        {
            if (!b.hasOwnProperty(prop))
            {
                return false;
            }

            if (!this._equals(a[prop], b[prop]))
            {
                return false;
            }

            seenProperties[prop] = true;
        }
    }

    for (var prop in b)
    {
        if (!(prop in seenProperties) && b.hasOwnProperty(prop))
        {
            if (!a.hasOwnProperty(prop))
            {
                return false;
            }

            if (!this._equals(b[prop], a[prop]))
            {
                return false;
            }
        }
    }

    return true;
};

Использование в качестве примера:

>>> var map = new ObjectMap();
>>> var o = {a: 1, b: [1,2], c: true};
>>> map.put(o, "buns");
>>> map.get(o)
"buns"
>>> map.get({a: 1, b: [1,2], c: true});
"buns"
>>> map.get({a: 1, b: [1,2], c: true, d:"hi"});
>>> var a = [1,2,3];
>>> map.put(a, "cheese");
>>> map.get(a);
"cheese"
>>> map.get([1,2,3]);
"cheese"
>>> map.get([1,2,3,4]);
>>> var d = new Date();
>>> map.put(d, "toast");
>>> map.get(d);
"toast"
>>> map.get(new Date(d.valueOf()));
"toast"

Это никоим образом не полноценное внедрение, просто указатель для способа реализовать такой объект. Например, взгляд на то, что я дал, необходимо было бы также добавить проверки свойства конструктора перед проверкой свойства объекта, поскольку это в настоящее время работает:

>>> function TestObject(a) { this.a = a; };
>>> var t = new TestObject("sandwich");
>>> map.put(t, "butter");
>>> map.get({a: "sandwich"})
"butter"
0
ответ дан 8 December 2019 в 03:02
поделиться

Я выпустил отдельную реализацию хеш-таблицы JavaScript, которая идет дальше перечисленных здесь.

http://www.timdown.co.uk/jshashtable/

7
ответ дан 8 December 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: