So führen Sie assoziatives Array / Hashing in JavaScript durch

574

Ich muss einige Statistiken mit JavaScript so speichern, wie ich es in C # tun würde:

Dictionary<string, int> statistics;

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

Gibt es ein Hashtableoder so etwas Dictionary<TKey, TValue>in JavaScript?
Wie kann ich Werte so speichern?

George2
quelle
1
js ist lose eingegeben, daher gibt es keine Möglichkeit, nur einen String oder int zu deklarieren. Sie können einfach einen var deklarieren und ihm einen String oder int zuweisen. : D
Gordon Gustafson
Vielleicht möchten Sie xDict ausprobieren. jsfiddle.net/very/MuVwd Es ist ein Wörterbuch String => alles, was in Javascript geschrieben ist.
Robert
Dieser Artikel enthält eine hervorragende Erklärung, wie assoziative Arrays unter der Haube in Javascript implementiert werden. Jayconrod.com/posts/52/a-tour-of-v8-object-representation
Shuklaswag
Die akzeptierte Antwort wurde 2009 geschrieben - sie unterstützt nur Zeichenfolgenschlüssel . Verwenden Sie für Schlüssel ohne Zeichenfolge Map oder WeakMap, wie in Vitaliis Antwort .
ToolmakerSteve

Antworten:

564

Verwenden Sie JavaScript-Objekte als assoziative Arrays .

Assoziatives Array: In einfachen Worten verwenden assoziative Arrays Strings anstelle von Integer-Zahlen als Index.

Erstellen Sie ein Objekt mit

var dictionary = {};

Mit Javascript können Sie Objekten mithilfe der folgenden Syntax Eigenschaften hinzufügen:

Object.yourProperty = value;

Eine alternative Syntax für dasselbe ist:

Object["yourProperty"] = value;

Wenn Sie auch Schlüssel zur Bewertung von Objektzuordnungen mit der folgenden Syntax erstellen können

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

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

Sie können ein assoziatives Array mit dem for..in-Schleifenkonstrukt wie folgt durchlaufen

for(var key in Object.keys(dict)){
  var value = dict[key];
  /* use key/value for intended purpose */
}
Alek Davis
quelle
36
Beachten Sie, dass der Ansatz des Autors, ein "assoziatives Array" mit zu initialisieren, new Array()verpönt ist. Der Artikel erwähnt schließlich seine Nachteile und schlägt vor new Object()oder {}als bevorzugte Alternativen, aber das ist kurz vor dem Ende und ich fürchte, die meisten Leser werden nicht so weit kommen.
Daniel Lubarov
23
Scheitern. JavaScript unterstützt keine Objektreferenzen als Schlüssel, während dies bei Flash / AS3 Dictionary der Fall ist. In JavaScript, var obj1 = {}; var obj2 = {}; var table= {}; table[obj1] = "A"; table[obj2] = "B"; alert(table[obj1]); //displays Bweil es nicht zwischen den Schlüsseln obj1 und obj2 unterscheiden kann; Sie werden beide in Zeichenfolgen konvertiert und werden so etwas wie "Objekt". Total fehlgeschlagen und macht die typsichere Serialisierung mit intakten Referenzen und zyklischen Referenzen in JavaScript schwierig oder nicht performant. In Flash / AS3 ist das ganz einfach.
Triynko
Nun, der einzige Weg in JS, den wir validieren können, indem wir die Gleichheit überprüfen oder eine Gleichheitsmethode wie Point.prototype.equals = function(obj) { return (obj instanceof Point) && (obj.x === this.x) && (obj.y === this.y); };
folgt
1
@Leo console.log ({A: 'B', C: 'D'} [foo]) sollte Ihnen A B geben
ychaouche
2
@ Leo Das Beispiel scheint falsch. for... indenn ein Wörterbuch Object.keysdurchläuft seine Schlüssel und scheint dort fehl am Platz zu sein. Object.keysGibt ein Array der Schlüssel des Wörterbuchs zurück, und for... infür ein Array werden die "Schlüssel" durchlaufen, die für ein Array seine Indizes und nicht seine Werte sind.
JHH
434
var associativeArray = {};
associativeArray["one"] = "First";
associativeArray["two"] = "Second";
associativeArray["three"] = "Third";

Wenn Sie aus einer objektorientierten Sprache kommen, sollten Sie diesen Artikel lesen .

Dani Cricco
quelle
38
Sie können dies auch in weniger Zeilen tun: var assoziativeArray = {"eins": "Erste", "zwei": "zweite", "drei": "Dritte"}; Dann gibt assoziativeArray ["eins"] "Erste" und assocativeArray ["vier"] null zurück.
Tony Wickham
2
Sorry @JuusoOhtonen, ich habe den Beitrag vor 6 Jahren geschrieben (es ist unglaublich, wie schnell die Zeit vergeht). Ich habe den Link aktualisiert. Bitte überprüfen Sie es und zögern Sie nicht zu fragen, wenn Sie irgendwelche Zweifel haben
Dani Cricco
145

Alle modernen Browser unterstützen ein Javascript- Map- Objekt. Es gibt mehrere Gründe, die die Verwendung einer Karte besser machen als ein Objekt:

  • Ein Objekt hat einen Prototyp, daher gibt es Standardschlüssel in der Karte.
  • Die Schlüssel eines Objekts sind Zeichenfolgen, wobei sie einen beliebigen Wert für eine Karte haben können.
  • Sie können die Größe einer Karte leicht ermitteln, während Sie die Größe eines Objekts verfolgen müssen.

Beispiel:

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"

Wenn Sie möchten, dass Schlüssel, auf die nicht von anderen Objekten verwiesen wird, als Müll gesammelt werden, sollten Sie eine WeakMap anstelle einer Map verwenden.

Vitalii Fedorenko
quelle
5
Hoffentlich wird dies in ein paar Jahren die am meisten gewählte Antwort sein.
Cameron Lee
1
@ CameronLee sicherlich wird es
Loïc Faure-Lacroix
1
Dies Mapist kaum nützlich, wenn Ihr Schlüssel ein Objekt ist, aber nach Wert und nicht nach Referenz verglichen werden sollte.
Siyuan Ren
7
Mehr als ein Jahr, nachdem diese Antwort geschrieben wurde, ist es immer noch NICHT wahr, dass "alle modernen Browser Map unterstützen". Nur auf dem Desktop können Sie sich auf mindestens grundlegende Map-Unterstützung verlassen. Nicht auf mobilen Geräten. Zum Beispiel hat der Android-Browser überhaupt keine Kartenunterstützung. Selbst auf dem Desktop sind einige Implementierungen unvollständig. Zum Beispiel unterstützt IE11 die Aufzählung über "for ... of ..." immer noch nicht. Wenn Sie also IE-Kompatibilität wünschen, müssen Sie den ekelhaften .forEach-Kludge verwenden. Außerdem funktioniert JSON.stringify () in keinem Browser, den ich ausprobiert habe, für Map. Auch Initialisierer funktionieren nicht in IE oder Safari.
Dave Burton
3
Es gibt eine hervorragende Browserunterstützung. Erneut überprüfen. In jedem Fall ist dies recht einfach zu füllen, sodass die native Browserunterstützung kein Problem darstellt.
Brad
132

Verwenden Sie einfach ein normales Objekt, es sei denn, Sie haben einen bestimmten Grund, dies nicht zu tun. Auf Objekteigenschaften in Javascript kann mithilfe der Syntax im Hashtable-Stil verwiesen werden:

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

Beide foound barElemente können nun wie folgt referenziert werden:

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

Dies bedeutet natürlich, dass Ihre Schlüssel Zeichenfolgen sein müssen. Wenn es sich nicht um Zeichenfolgen handelt, werden sie intern in Zeichenfolgen konvertiert, sodass dies möglicherweise weiterhin funktioniert, YMMV.

roryf
quelle
1
Schlüssel als ganze Zahlen verursachten mir kein Problem. stackoverflow.com/questions/2380019/…
Jonas Elfström
10
Jonas: Denken Sie daran, dass Ihre Ganzzahlen beim Festlegen der Eigenschaft in Zeichenfolgen konvertiert werden: var hash = {}; hash[1] = "foo"; alert(hash["1"]);Warnungen "foo".
Tim Down
17
Was ist, wenn einer Ihrer Schlüssel " Proto " oder " Eltern " ist?
PleaseStand
5
Beachten Sie, dass Objekte in JavaScript nicht als Schlüssel verwendet werden können . Nun, sie können, aber sie werden in ihre String-Darstellungen konvertiert, sodass jedes Objekt genau derselbe Schlüssel ist. Siehe @ TimDowns jshashtable-Vorschlag unten.
Ericsoco
21
Dieses Beispiel ist verwirrend, da Sie in zwei Fällen foo und bar als Schlüssel und Wert verwenden. Viel klarer zu zeigen , dass var dict = {}; dict.key1 = "val1"; dict["key2"] = "val2";Schlüssel1 Element dict kann äquivalent durch beiden referenziert werden dict["key1"]und dict.key1.
Jim
49

Da sich jedes Objekt in JS wie eine Hashtabelle verhält und im Allgemeinen als Hashtabelle implementiert wird, gehe ich einfach so vor ...

var hashSweetHashTable = {};
Shog9
quelle
26
Downvoted, da nicht angezeigt wird, wie tatsächlich auf Werte in der "Hashtabelle" zugegriffen wird.
IQAndreas
Ich bin 9 Jahre zu spät (ich wusste damals nicht viel über Programmierung, geschweige denn über diese Seite), aber ... Was ist, wenn Sie versuchen, Punkte auf einer Karte zu speichern und sehen müssen, ob bereits etwas vorhanden ist? an einem Punkt auf einer Karte? In diesem Fall verwenden Sie am besten HashTable, indem Sie nach Koordinaten suchen (ein Objekt , keine Zeichenfolge ).
Mike Warren
@MikeWarren if (hashSweetHashTable.foo)sollte den if-Block eingeben, wenn foogesetzt ist.
Koray Tugay
21

In C # sieht der Code also so aus:

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

oder

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

in JavaScript

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

C # Dictionary - Objekt enthält nützliche Methoden wie dictionary.ContainsKey() in JavaScript wir das nutzen könnten hasOwnPropertywie

if (dictionary.hasOwnProperty("sample1"))
    console.log("sample1 key found and its value is"+ dictionary["sample1"]);
Raj
quelle
1
Upvote für mich, dass ich keine Antwort schreiben muss überhasOwnProperty
brichins
18

Wenn Sie möchten, dass Ihre Schlüssel ein beliebiges Objekt sind und nicht nur Zeichenfolgen, können Sie meine jshashtable verwenden .

Tim Down
quelle
3
Wie viele Stunden habe ich damit verbracht, über die Tatsache zu stolpern, dass Objekte nicht wirklich als Schlüssel für JS-artige Objekte als assoziative Arrays verwendet werden können, bevor ich dies gefunden habe? Danke, Tim.
Ericsoco
1
Flash / AS3 Dictionary unterstützt zusammen mit den meisten anderen Sprachen Objektreferenzen als Schlüssel. JavaScript hat es noch nicht implementiert, aber ich denke, es ist in einer zukünftigen Spezifikation als eine Art Map-Klasse. In der Zwischenzeit wieder mit den Polyfills; Soviel zu Standards. Oh, warte ... endlich im Jahr 2015 scheint Map angekommen zu sein: stackoverflow.com/a/30088129/88409 und wird von "modernen" Browsern unterstützt, lol: kangax.github.io/compat-table/es6/# Karte (und nicht wirklich weit verbreitet). Nur ein Jahrzehnt hinter AS3.
Triynko
Tim, vielleicht solltest du jshashtable aktualisieren, um Map () zu verwenden, sofern verfügbar.
Dave Burton
1
@ DaveBurton: Guter Plan. Ich werde es tun, sobald ich etwas Zeit habe.
Tim Down
6
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;
    }
}
Birey
quelle
1
Können Sie bitte kommentieren, warum dies nicht der Fall ist? Diese Antwort wurde 2011 veröffentlicht und nicht zum aktuellen Datum.
Birey
2
Ich habe nicht herabgestimmt, aber ... Sie sollten kein Array als Objekt verwenden. Nicht 100% sicher, ob dies Ihre Absicht war. Verwenden Sie Slice für nicht gelöschte Arrays, um sie neu zu indizieren. Löschen ist in Ordnung, wird jedoch auf undefiniert gesetzt - besser explizit; use = undefined für ein Objekt zu b / c es ist schneller (aber mehr Speicher). Kurz gesagt: Verwenden Sie immer ein Objekt: {}kein Array: []oder new Array()wenn Sie Zeichenfolgenschlüssel haben möchten, sonst hat die js-Engine ein Problem - entweder werden 2 Typen für 1 Variable angezeigt, was keine Optimierung bedeutet, oder es wird mit Array ausgeführt und realisiert es muss zum Objekt wechseln (mögliche Neuzuweisung).
Graeme Wicksted
2
Genau wie bei der Antwort von Alex Hawkins, geben Sie bitte eine Erklärung, warum dieser ziemlich komplex aussehende Code tatsächlich nützlich und besser ist als die anderen kürzeren Antworten, die hier gegeben werden.
Thomas Tempelmann
6

Ich habe dies erstellt, um ein Problem zu lösen, wie z. B. Objektschlüsselzuordnung, Aufzählungsfähigkeit (mit forEach()Methode) und Löschen.

function Hashtable() {
    this._map = new Map();
    this._indexes = new Map();
    this._keys = [];
    this._values = [];
    this.put = function(key, value) {
        var newKey = !this.containsKey(key);
        this._map.set(key, value);
        if (newKey) {
            this._indexes.set(key, this.length);
            this._keys.push(key);
            this._values.push(value);
        }
    };
    this.remove = function(key) {
        if (!this.containsKey(key))
            return;
        this._map.delete(key);
        var index = this._indexes.get(key);
        this._indexes.delete(key);
        this._keys.splice(index, 1);
        this._values.splice(index, 1);
    };
    this.indexOfKey = function(key) {
        return this._indexes.get(key);
    };
    this.indexOfValue = function(value) {
        return this._values.indexOf(value) != -1;
    };
    this.get = function(key) {
        return this._map.get(key);
    };
    this.entryAt = function(index) {
        var item = {};
        Object.defineProperty(item, "key", {
            value: this.keys[index],
            writable: false
        });
        Object.defineProperty(item, "value", {
            value: this.values[index],
            writable: false
        });
        return item;
    };
    this.clear = function() {
        var length = this.length;
        for (var i = 0; i < length; i++) {
            var key = this.keys[i];
            this._map.delete(key);
            this._indexes.delete(key);
        }
        this._keys.splice(0, length);
    };
    this.containsKey = function(key) {
        return this._map.has(key);
    };
    this.containsValue = function(value) {
        return this._values.indexOf(value) != -1;
    };
    this.forEach = function(iterator) {
        for (var i = 0; i < this.length; i++)
            iterator(this.keys[i], this.values[i], i);
    };
    Object.defineProperty(this, "length", {
        get: function() {
            return this._keys.length;
        }
    });
    Object.defineProperty(this, "keys", {
        get: function() {
            return this._keys;
        }
    });
    Object.defineProperty(this, "values", {
        get: function() {
            return this._values;
        }
    });
    Object.defineProperty(this, "entries", {
        get: function() {
            var entries = new Array(this.length);
            for (var i = 0; i < entries.length; i++)
                entries[i] = this.entryAt(i);
            return entries;
        }
    });
}


Dokumentation der Klasse Hashtable

Methoden:

  • get(key)
    Gibt den Wert zurück, der dem angegebenen Schlüssel zugeordnet ist.
    Parameter ::
    key Der Schlüssel, von dem der Wert abgerufen wird.

  • put(key, value)
    Ordnet den angegebenen Wert dem angegebenen Schlüssel zu.
    Parameter ::
    key Der Schlüssel, dem der Wert zugeordnet ist.
    value: Der Wert, der dem Schlüssel zugeordnet werden soll.

  • remove(key)
    Entfernt den angegebenen Schlüssel mit seinem Wert.
    Parameter ::
    key Der zu entfernende Schlüssel.

  • clear()
    Löscht alle Hashtabellen und entfernt sowohl die Schlüssel als auch die Werte.

  • indexOfKey(key)
    Gibt den Index des angegebenen Schlüssels basierend auf der Additionsreihenfolge zurück.
    Parameter ::
    key Der Schlüssel, der den Index erhält.

  • indexOfValue(value)
    Gibt den Index des angegebenen Werts basierend auf der Additionsreihenfolge zurück.
    Parameter ::
    value Der Wert, dessen Index abgerufen wird.
    Hinweise:
    Diese Informationen werden von der indexOf()Methode eines Arrays abgerufen , sodass das Objekt nur mit der toString()Methode verglichen wird.

  • entryAt(index)
    Gibt ein Objekt mit zwei Eigenschaften zurück: Schlüssel und Wert, die den Eintrag am angegebenen Index darstellen.
    Parameter ::
    index Der Index des abzurufenden Eintrags.

  • containsKey(key)
    Gibt zurück, ob die Hashtabelle den angegebenen Schlüssel enthält.
    Parameter ::
    key Der zu überprüfende Schlüssel.

  • containsValue(value)
    Gibt zurück, ob die Hashtabelle den angegebenen Wert enthält.
    Parameter ::
    value Der zu überprüfende Wert.

  • forEach(iterator)
    Iteriert alle Einträge in der angegebenen iterator.
    Parameter ::
    value Eine Methode mit 3 Parametern : key, valueund index, wobei indexder Index des Eintrags dargestellt wird.

    Eigenschaften:

  • length ( Schreibgeschützt )
    Ruft die Anzahl der Einträge in der Hashtabelle ab.

  • keys ( Schreibgeschützt )
    Ruft ein Array aller Schlüssel in der Hashtabelle ab.

  • values ( Schreibgeschützt )
    Ruft ein Array aller Werte in der Hashtabelle ab.

  • entries ( Schreibgeschützt )
    Ruft ein Array aller Einträge in der Hashtabelle ab. Sie werden in der gleichen Form der Methode dargestellt entryAt().

Davide Cannizzo
quelle
2

https://gist.github.com/alexhawkins/f6329420f40e5cafa0a4

var HashTable = function() {
  this._storage = [];
  this._count = 0;
  this._limit = 8;
}


HashTable.prototype.insert = function(key, value) {
  //create an index for our storage location by passing it through our hashing function
  var index = this.hashFunc(key, this._limit);
  //retrieve the bucket at this particular index in our storage, if one exists
  //[[ [k,v], [k,v], [k,v] ] , [ [k,v], [k,v] ]  [ [k,v] ] ]
  var bucket = this._storage[index]
    //does a bucket exist or do we get undefined when trying to retrieve said index?
  if (!bucket) {
    //create the bucket
    var bucket = [];
    //insert the bucket into our hashTable
    this._storage[index] = bucket;
  }

  var override = false;
  //now iterate through our bucket to see if there are any conflicting
  //key value pairs within our bucket. If there are any, override them.
  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    if (tuple[0] === key) {
      //overide value stored at this key
      tuple[1] = value;
      override = true;
    }
  }

  if (!override) {
    //create a new tuple in our bucket
    //note that this could either be the new empty bucket we created above
    //or a bucket with other tupules with keys that are different than 
    //the key of the tuple we are inserting. These tupules are in the same
    //bucket because their keys all equate to the same numeric index when
    //passing through our hash function.
    bucket.push([key, value]);
    this._count++
      //now that we've added our new key/val pair to our storage
      //let's check to see if we need to resize our storage
      if (this._count > this._limit * 0.75) {
        this.resize(this._limit * 2);
      }
  }
  return this;
};


HashTable.prototype.remove = function(key) {
  var index = this.hashFunc(key, this._limit);
  var bucket = this._storage[index];
  if (!bucket) {
    return null;
  }
  //iterate over the bucket
  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    //check to see if key is inside bucket
    if (tuple[0] === key) {
      //if it is, get rid of this tuple
      bucket.splice(i, 1);
      this._count--;
      if (this._count < this._limit * 0.25) {
        this._resize(this._limit / 2);
      }
      return tuple[1];
    }
  }
};



HashTable.prototype.retrieve = function(key) {
  var index = this.hashFunc(key, this._limit);
  var bucket = this._storage[index];

  if (!bucket) {
    return null;
  }

  for (var i = 0; i < bucket.length; i++) {
    var tuple = bucket[i];
    if (tuple[0] === key) {
      return tuple[1];
    }
  }

  return null;
};


HashTable.prototype.hashFunc = function(str, max) {
  var hash = 0;
  for (var i = 0; i < str.length; i++) {
    var letter = str[i];
    hash = (hash << 5) + letter.charCodeAt(0);
    hash = (hash & hash) % max;
  }
  return hash;
};


HashTable.prototype.resize = function(newLimit) {
  var oldStorage = this._storage;

  this._limit = newLimit;
  this._count = 0;
  this._storage = [];

  oldStorage.forEach(function(bucket) {
    if (!bucket) {
      return;
    }
    for (var i = 0; i < bucket.length; i++) {
      var tuple = bucket[i];
      this.insert(tuple[0], tuple[1]);
    }
  }.bind(this));
};


HashTable.prototype.retrieveAll = function() {
  console.log(this._storage);
  //console.log(this._limit);
};

/******************************TESTS*******************************/

var hashT = new HashTable();

hashT.insert('Alex Hawkins', '510-599-1930');
//hashT.retrieve();
//[ , , , [ [ 'Alex Hawkins', '510-599-1930' ] ] ]
hashT.insert('Boo Radley', '520-589-1970');
//hashT.retrieve();
//[ , [ [ 'Boo Radley', '520-589-1970' ] ], , [ [ 'Alex Hawkins', '510-599-1930' ] ] ]
hashT.insert('Vance Carter', '120-589-1970').insert('Rick Mires', '520-589-1970').insert('Tom Bradey', '520-589-1970').insert('Biff Tanin', '520-589-1970');
//hashT.retrieveAll();
/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Tom Bradey', '520-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Rick Mires', '520-589-1970' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '520-589-1970' ] ] ]
*/

//overide example (Phone Number Change)
//
hashT.insert('Rick Mires', '650-589-1970').insert('Tom Bradey', '818-589-1970').insert('Biff Tanin', '987-589-1970');
//hashT.retrieveAll();

/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Tom Bradey', '818-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Rick Mires', '650-589-1970' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]

*/

hashT.remove('Rick Mires');
hashT.remove('Tom Bradey');
//hashT.retrieveAll();

/* 
[ ,
  [ [ 'Boo Radley', '520-589-1970' ] ],
  ,
  [ [ 'Alex Hawkins', '510-599-1930' ] ],
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]


*/

hashT.insert('Dick Mires', '650-589-1970').insert('Lam James', '818-589-1970').insert('Ricky Ticky Tavi', '987-589-1970');
hashT.retrieveAll();


/* NOTICE HOW HASH TABLE HAS NOW DOUBLED IN SIZE UPON REACHING 75% CAPACITY ie 6/8. It is now size 16.
 [,
  ,
  [ [ 'Vance Carter', '120-589-1970' ] ],
  [ [ 'Alex Hawkins', '510-599-1930' ],
    [ 'Dick Mires', '650-589-1970' ],
    [ 'Lam James', '818-589-1970' ] ],
  ,
  ,
  ,
  ,
  ,
  [ [ 'Boo Radley', '520-589-1970' ],
    [ 'Ricky Ticky Tavi', '987-589-1970' ] ],
  ,
  ,
  ,
  ,
  [ [ 'Biff Tanin', '987-589-1970' ] ] ]




*/
console.log(hashT.retrieve('Lam James'));  //818-589-1970
console.log(hashT.retrieve('Dick Mires')); //650-589-1970
console.log(hashT.retrieve('Ricky Ticky Tavi')); //987-589-1970
console.log(hashT.retrieve('Alex Hawkins')); //510-599-1930
console.log(hashT.retrieve('Lebron James')); //null
Alex Hawkins
quelle
3
Sieht gut aus. Erklären Sie jetzt bitte auch, WARUM dies nützlich ist und möglicherweise besser geeignet ist als alle anderen Antworten hier.
Thomas Tempelmann
1

Sie können eine erstellen, indem Sie Folgendes verwenden:

var dictionary = { Name:"Some Programmer", Age:24, Job:"Writing Programs"  };

//Iterate Over using keys
for (var key in dictionary) {
  console.log("Key: " + key + " , " + "Value: "+ dictionary[key]);
}

//access a key using object notation:
console.log("Her Name is: " + dictionary.Name)

Ali Ezzat Odeh
quelle