web-dev-qa-db-fra.com

Quel est l'équivalent JavaScript d'un hachage C #?

J'ai une liste de quelques milliers de clés entières. La seule chose que je dois faire avec cette liste est de dire si une valeur donnée est dans la liste.

Pour C #, j'utiliserais un HashSet pour effectuer cette recherche rapidement. Quel est l'équivalent JavaScript?


Niveau de support minimal: IE 9+, jQuery (actuel)

51
Jonathan Allen

Sous le capot, l'objet JavaScript est implémenté avec une table de hachage. Donc, votre Key:Value _ paire serait (your integer):true

Une fonction de recherche à temps constant pourrait être implémentée comme suit:

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

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


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

En fait, JavaScript fournit un objet Set , assez simple à utiliser:

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

set.has(1)    // true

Malheureusement, ce n'est pas compatible avec IE9.

47
João Barbosa

Utilisez un objet. Pour ajouter une clé à l'ensemble, faites:

object[key] = true;

Pour tester si une clé est dans le jeu, faites:

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

Pour supprimer une clé du jeu, procédez comme suit:

delete object[key]
30
Barmar

Vous pouvez utiliser uniquement un objet JavaScript normal et le mot clé "in" pour voir si cet objet a une certaine clé.

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

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

Ou si vous savez que des objets dans votre objet seront éventuellement créés dans des propriétés JavaScript, utilisez les propriétés de l'objet JavaScript ...

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

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

Carte ou s'il n'est pas nécessaire d'itérer WeakMap

let m1=new Map();

m1.set('isClosed',false);
m1.set('isInitialized',false);

m1.set('isClosed',true);

m1.forEach(function(v,k)
{
    console.log(`${k}=${v}`);
});
1
Kursat Turkay

J'ai lu les solutions et j'en ai essayé. Après avoir essayé d'utiliser la méthode object[key], J'ai compris que cela ne marcherait pas. Je voulais un HashSet pouvant stocker des éléments HTML. Lors de l'ajout de ces objets, le key a été traduit en chaîne. C'est pourquoi j'ai créé mon propre jeu basé sur jQuery. Il supporte add, remove, contains et 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;
    };
};

Note
Lorsque vous ajoutez quelque chose comme $('#myElement') à l'ensemble, vous devez ajouter le véritable élément HTML $('#myElement')[0]. Oh ... et si vous voulez conserver une liste des commandes modifiées - utilisez le nom de l'élément (m'a donné un problème avec les commandes :radio).

Note2
Je pense que le object[key] Pourrait être plus rapide pour vos entiers.

Note
Si vous ne voulez stocker que des nombres ou des chaînes, cet ensemble sera plus rapide:

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);
    };
};
1
Kees C. Bakker