Подтвердить что ты не робот

Что такое JavaScript, эквивалентный С# HashSet?

У меня есть список из нескольких тысяч целых ключей. Единственное, что мне нужно сделать с этим списком, это сказать, указано ли данное значение в списке.

Для С# я бы использовал HashSet для быстрого поиска. Что такое эквивалент JavaScript?


Минимальный уровень поддержки: IE 9+, jQuery (текущий)

4b9b3361

Ответ 1

Под капотом объект JavaScript реализуется с помощью хеш-таблицы. Таким образом, ваша пара Key:Value будет (your integer):true

Функция поиска по постоянному времени может быть реализована как:

var hash = {
1:true,
2:true,
7:true
//etc...
};

var checkValue = function(value){
  return hash[value] === true;
};


checkValue(7); // => true
checkValue(3); // => false

Ответ 2

Используйте объект. Чтобы добавить ключ к набору, выполните следующие действия:

object[key] = true;

Чтобы проверить, находится ли ключ в наборе, выполните:

if (object.hasOwnProperty(key)) { ... }

Чтобы удалить ключ из набора, выполните:

delete object[key]

Ответ 3

На самом деле JavaScript предоставляет Установить объект, довольно простой в использовании:

var set = new Set();
set.add(1);
set.add(2);

set.has(1)    // true

К сожалению, он несовместим с IE9.

Ответ 4

Вы можете использовать только обычный объект JavaScript и ключевое слово 'in', чтобы узнать, есть ли у этого объекта определенный ключ.

var myObj = {
  name: true,
  age: true
}

'name' in myObj //returns true;
'height' in myObj // returns false;

Или, если вы знаете, что у вас будут ключи в вашем объекте, которые могут быть созданы в свойствах объекта JavaScript, используйте...

var myObj = {
  name: true,
  age: true
}

myObj.hasOwnProperty('name') //returns true;
myObj.hasOwnProperty('height') // returns false;

Ответ 5

Я читал решения, и я пробовал. Попытавшись использовать метод object[key], я понял, что он не сработает. Я хотел, чтобы HashSet мог хранить элементы HTML. При добавлении этих объектов key был переведен в строку, поэтому я придумал свой собственный набор, основанный на jQuery. Он поддерживает add, remove, contains и clear.

var HashSet = function () {

    var set = [];

    this.add = function (obj) {
        if (!this.contains(obj)) {
            set.push(obj);
        }
    };

    this.remove = function (obj) {
        set = jQuery.grep(set, function (value) {
            return value !== obj;
        });
    };

    this.clear = function () {
        set = [];
    };

    this.contains = function (obj) {
        return $.inArray(obj, set) > -1;
    };

    this.isEmpty = function () {
        return set.length === 0;
    };
};

Примечание
Добавляя в набор что-то вроде $('#myElement'), нужно добавить настоящий HTML-элемент $('#myElement')[0]. О... и если вы хотите сохранить список измененных элементов управления - используйте имя элемента (дал мне проблему с элементами управления :radio).

Примечание2
Я думаю, что object[key] может быть быстрее для ваших целых чисел.

Note3
Если вы собираетесь хранить только цифры или строку, этот набор будет быстрее:

var HashSet = function () {

    var set = {};

    this.add = function (key) {
        set[key] = true;
    };

    this.remove = function (key) {
        delete set[key];
    };

    this.clear = function () {
        set = {};
    };

    this.contains = function (key) {
        return set.hasOwnProperty(key);
    };

    this.isEmpty = function () {
        return jQuery.isEmptyObject(set);
    };
};