Frage gibt es Wörterbücher in Javascript wie Python?


Ich muss ein Wörterbuch in Javascript so machen

Ich erinnere mich nicht an die genaue Schreibweise, aber es war etwas wie:

states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }

Gibt es so etwas in Javascript?


75
2017-08-24 17:15


Ursprung


Antworten:


Dies ist ein alter Post, aber ich dachte, ich sollte trotzdem eine bebilderte Antwort geben.

Verwenden Sie die Objektnotation von JavaScript. Wie so:

states_dictionary={ 
     "CT":["alex","harry"], 
     "AK":["liza","alex"], 
     "TX":["fred", "harry"]
};

Und um auf die Werte zuzugreifen:

states_dictionary.AK[0] //which is liza

oder Sie können JavaScript-Literal-Objektnotation verwenden, wobei die Schlüssel nicht in Anführungszeichen stehen müssen:

states_dictionary={ 
     CT:["alex","harry"], 
     AK:["liza","alex"], 
     TX:["fred", "harry"]
};

97
2017-08-03 05:19



Es gibt keine echten assoziativen Arrays in Javascript. Sie können versuchen, Objekte zu verwenden:

var x = new Object();
x["Key"] = "Value";

Bei Objekten ist es jedoch nicht möglich, typische Array-Eigenschaften oder Methoden wie array.length zu verwenden. Zumindest ist es möglich, in einer For-in-Loop auf das "Objekt-Array" zuzugreifen.


45
2017-08-24 17:26



Habe hier ein einfaches Wörterbuch in JS erstellt:

function JSdict() {
    this.Keys = [];
    this.Values = [];
}

// Check if dictionary extensions aren't implemented yet.
// Returns value of a key
if (!JSdict.prototype.getVal) {
    JSdict.prototype.getVal = function (key) {
        if (key == null) {
            return "Key cannot be null";
        }
        for (var i = 0; i < this.Keys.length; i++) {
            if (this.Keys[i] == key) {
                return this.Values[i];
            }
        }
        return "Key not found!";
    }
}


// Check if dictionary extensions aren't implemented yet.
// Updates value of a key
if (!JSdict.prototype.update) {
    JSdict.prototype.update = function (key, val) {
        if (key == null || val == null) {
            return "Key or Value cannot be null";
        }
        // Verify dict integrity before each operation
        if (keysLength != valsLength) {
            return "Dictionary inconsistent. Keys length don't match values!";
        }
        var keysLength = this.Keys.length;
        var valsLength = this.Values.length;
        var flag = false;
        for (var i = 0; i < keysLength; i++) {
            if (this.Keys[i] == key) {
                this.Values[i] = val;
                flag = true;
                break;
            }
        }
        if (!flag) {
            return "Key does not exist";
        }
    }
}



// Check if dictionary extensions aren't implemented yet.
// Adds a unique key value pair
if (!JSdict.prototype.add) {
    JSdict.prototype.add = function (key, val) {
        // Allow only strings or numbers as keys
        if (typeof (key) == "number" || typeof (key) == "string") {
            if (key == null || val == null) {
                return "Key or Value cannot be null";
            }
            if (keysLength != valsLength) {
                return "Dictionary inconsistent. Keys length don't match values!";
            }
            var keysLength = this.Keys.length;
            var valsLength = this.Values.length;
            for (var i = 0; i < keysLength; i++) {
                if (this.Keys[i] == key) {
                    return "Duplicate keys not allowed!";
                }
            }
            this.Keys.push(key);
            this.Values.push(val);
        }
        else {
            return "Only number or string can be key!";
        }
    }
}

// Check if dictionary extensions aren't implemented yet.
// Removes a key value pair
if (!JSdict.prototype.remove) {
    JSdict.prototype.remove = function (key) {
        if (key == null) {
            return "Key cannot be null";
        }
        if (keysLength != valsLength) {
            return "Dictionary inconsistent. Keys length don't match values!";
        }
        var keysLength = this.Keys.length;
        var valsLength = this.Values.length;
        var flag = false;
        for (var i = 0; i < keysLength; i++) {
            if (this.Keys[i] == key) {
                this.Keys.shift(key);
                this.Values.shift(this.Values[i]);
                flag = true;
                break;
            }
        }
        if (!flag) {
            return "Key does not exist";
        }
    }
}

Die obige Implementierung kann nun verwendet werden, um ein Wörterbuch wie folgt zu simulieren:

var dict = new JSdict();

dict.add(1, "one")

dict.add(1, "one more")
"Duplicate keys not allowed!"

dict.getVal(1)
"one"

dict.update(1, "onne")

dict.getVal(1)
"onne"

dict.remove(1)

dict.getVal(1)
"Key not found!"

Dies ist nur eine grundlegende Simulation. Es kann weiter optimiert werden, indem ein besserer Laufzeitalgorithmus implementiert wird, um mit mindestens einer O (nlogn) -Zeitkomplexität zu arbeiten. Wie merge / schnell sortiere auf Arrays und dann einige B-Suche nach Nachschlagen. Ich habe es nicht versucht oder gesucht, eine Hash-Funktion in JS zuzuordnen.

Außerdem können Schlüssel und Wert für das JSdict-Objekt in private Variablen umgewandelt werden, um hinterhältig zu sein.

Hoffe das hilft!

BEARBEITEN >> Nach der Implementierung der oben genannten, habe ich persönlich die JS-Objekte als assoziative Arrays, die out-of-the-box verfügbar sind.

jedoch, Möchte ich eine besondere Erwähnung über zwei Methoden machen, die sich tatsächlich als hilfreich erwiesen haben, um es zu einer bequemen Hashtable-Erfahrung zu machen.

Nämlich: dict.hasOwnProperty (Schlüssel)  und  dict löschen

Lesen Sie diesen Beitrag als eine gute Ressource für diese Implementierung / Verwendung. Dynamisches Erstellen von Schlüsseln in assoziativem JavaScript-Array

Vielen Dank!


9
2017-08-30 14:10



Ich weiß, dass dies eine alte Frage ist, aber es taucht in Google auf, wenn Sie nach "Javascript-Wörterbüchern" suchen, also möchte ich zu den obigen Antworten hinzufügen, dass in ECMAScript 6 der Offizielle Map Objekt wurde eingeführt, das ist eine Wörterbuchimplementierung:

var dict = new Map();
dict.set("foo", "bar");

//returns "bar"
dict.get("foo");

Im Gegensatz zu den normalen Objekten von javascript erlaubt es jedes Objekt als Schlüssel:

var foo = {};
var bar = {};
var dict = new Map();
dict.set(foo, "Foo");
dict.set(bar, "Bar");

//returns "Bar"
dict.get(bar);

//returns "Foo"
dict.get(foo);

//returns undefined, as {} !== foo and {} !== bar
dict.get({});

9
2017-10-07 13:38



Verwenden Sie JavaScript-Objekte. Sie können auf ihre Eigenschaften wie Schlüssel in einem Wörterbuch zugreifen. Dies ist die Grundlage von JSON. Die Syntax ähnelt den Python-Wörterbüchern. Sehen: JSON.org


4
2017-08-24 17:18



Eine alte Frage, aber ich musste vor kurzem einen AS3> JS-Port erstellen, und aus Gründen der Geschwindigkeit schrieb ich ein einfaches AS3-Dictionary-Objekt für JS:

http://jsfiddle.net/MickMalone1983/VEpFf/2/

Wenn Sie es nicht wussten, können Sie im AS3-Wörterbuch jedes Objekt als Schlüssel verwenden, im Gegensatz zu nur Strings. Sie sind sehr praktisch, sobald Sie eine Verwendung für sie gefunden haben.

Es ist nicht so schnell wie ein natives Objekt, aber ich habe in dieser Hinsicht keine wesentlichen Probleme damit gefunden.

API:

//Constructor
var dict = new Dict(overwrite:Boolean);

//If overwrite, allows over-writing of duplicate keys,
//otherwise, will not add duplicate keys to dictionary.

dict.put(key, value);//Add a pair
dict.get(key);//Get value from key
dict.remove(key);//Remove pair by key
dict.clearAll(value);//Remove all pairs with this value
dict.iterate(function(key, value){//Send all pairs as arguments to this function:
    console.log(key+' is key for '+value);
});


dict.get(key);//Get value from key

3
2018-03-24 16:03



Firefox 13+ bietet eine experimentelle Implementierung des mapObjekt ähnlich dem dict Objekt in Python. Spezifikationen hier.

Es ist nur in Firefox, aber es sieht besser aus als mit Attributen von a new Object(). Zitat aus der Dokumentation:

  • Ein Objekt hat einen Prototyp, daher gibt es Standardschlüssel in der Karte. Dies kann jedoch mit umgangen werden map = Object.create(null).
  • Die Schlüssel eines Object sind Strings, wo sie für ein beliebiges sein können Map.
  • Sie können die Größe eines erhalten Map leicht, während Sie manuell die Größe für eine Object.

1
2018-06-24 01:13