Question Comment faire un tableau associatif / hashing en JavaScript


J'ai besoin de stocker des statistiques en utilisant JavaScript comme je le ferais en C #:

Dictionary<string, int> statistics;

statistics["Foo"] = 10;
statistics["Goo"] = statistics["Goo"] + 1;
statistics.Add("Zoo", 1);

Y'a-t-il un Hashtable ou quelque chose comme Dictionary<TKey, TValue> en JavaScript?
Comment pourrais-je stocker des valeurs de cette manière?


485
2017-07-30 17:52


origine


Réponses:


Utilisation Objets JavaScript en tant que tableaux associatifs.

Tableau associatif: Dans les mots simples, les tableaux associatifs utilisent des nombres au lieu de nombres entiers comme index.

Créer un objet avec

var dictionary = {};

Javascript vous permet d'ajouter des propriétés aux objets en utilisant la syntaxe suivante:

Object.yourProperty = value;

Une syntaxe alternative pour le même est:

Object["yourProperty"] = value;

Si vous pouvez également créer une clé pour valoriser les mappes d'objets avec la syntaxe suivante

var point = { x:3, y:2 };

point["x"] // returns 3
point.y // returns 2

Vous pouvez parcourir à travers un tableau associatif en utilisant la construction de boucle for..in comme suit

for(var key in Object.keys(dict)){
  var value = dict[key];
  /* use key/value for intended purpose */
}

464
2017-07-30 18:01



var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";

Si vous venez d'un langage orienté objet, vous devriez vérifier Cet article.


416
2017-07-30 18:25



Sauf si vous avez une raison spécifique de ne pas le faire, utilisez simplement un objet normal. Les propriétés d'objet en Javascript peuvent être référencées en utilisant la syntaxe hashtable-style:

var hashtable = {};
hashtable.foo = "bar";
hashtable['bar'] = "foo";

Tous les deux foo et bar les éléments peuvent maintenant être référencés comme suit:

hashtable['foo'];
hashtable['bar'];
// or
hashtable.foo;
hashtable.bar;

Bien sûr, cela signifie que vos clés doivent être des cordes. S'ils ne sont pas des chaînes, ils sont convertis en chaînes de caractères en interne, de sorte que cela peut encore fonctionner, YMMV.


126
2017-09-24 23:23



Tous les navigateurs modernes prennent en charge un javascript Carte objet. Il y a deux raisons qui rendent l'utilisation d'une carte meilleure que l'objet:

  • Un objet a un prototype, il y a donc des clés par défaut dans la carte.
  • Les clés d'un objet sont des chaînes, où elles peuvent être n'importe quelle valeur pour une carte.
  • Vous pouvez facilement obtenir la taille d'une carte pendant que vous devez garder la trace de la taille d'un objet.

Exemple:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

Si vous souhaitez que les clés qui ne sont pas référencées à partir d'autres objets soient collectées, utilisez un FaibleCarte au lieu d'une carte.


102
2018-05-06 21:42



Puisque chaque objet de JS se comporte comme - et est généralement implémenté comme - une hashtable, je vais juste avec ça ...

var hashSweetHashTable = {};

49
2017-09-24 23:18



Si vous voulez que vos clés soient des objets plutôt que des chaînes, vous pouvez utiliser mon jshashtable.


18
2018-06-01 11:32



donc en C # le code ressemble à:

Dictionary<string,int> dictionary = new Dictionary<string,int>();
dictionary.add("sample1", 1);
dictionary.add("sample2", 2);

ou

var dictionary = new Dictionary<string, int> {
    {"sample1", 1},
    {"sample2", 2}
};

en JavaScript

var dictionary = {
    "sample1": 1,
    "sample2": 2
}

Objet dictionnaire C # contient des méthodes utiles comme dictionary.ContainsKey() en JavaScript, nous pourrions utiliser le hasOwnProperty comme

if (dictionary.hasOwnProperty("sample1"))
    console.log("sample1 key found and its value is"+ dictionary["sample1"]);

18
2017-11-05 00:23



function HashTable() {
    this.length = 0;
    this.items = new Array();
    for (var i = 0; i < arguments.length; i += 2) {
        if (typeof (arguments[i + 1]) != 'undefined') {
            this.items[arguments[i]] = arguments[i + 1];
            this.length++;
        }
    }

    this.removeItem = function (in_key) {
        var tmp_previous;
        if (typeof (this.items[in_key]) != 'undefined') {
            this.length--;
            var tmp_previous = this.items[in_key];
            delete this.items[in_key];
        }

        return tmp_previous;
    }

    this.getItem = function (in_key) {
        return this.items[in_key];
    }

    this.setItem = function (in_key, in_value) {
        var tmp_previous;
        if (typeof (in_value) != 'undefined') {
            if (typeof (this.items[in_key]) == 'undefined') {
                this.length++;
            } else {
                tmp_previous = this.items[in_key];
            }

            this.items[in_key] = in_value;
        }

        return tmp_previous;
    }

    this.hasItem = function (in_key) {
        return typeof (this.items[in_key]) != 'undefined';
    }

    this.clear = function () {
        for (var i in this.items) {
            delete this.items[i];
        }

        this.length = 0;
    }
}

5
2017-11-04 15:51