So erstellen Sie ein Wörterbuch und fügen Schlüssel-Wert-Paare dynamisch in JavaScript hinzu

Lesezeit: 6 Minuten

KenEuckers Benutzeravatar
KenEucker

Aus dem Beitrag:

Senden eines JSON-Arrays zum Empfang als Dictionary,

Ich versuche, das Gleiche wie in diesem Beitrag zu tun. Das einzige Problem ist, dass ich die Schlüssel und Werte im Voraus nicht kenne. Ich muss also in der Lage sein, die Schlüssel-Wert-Paare dynamisch hinzuzufügen, weiß aber nicht, wie das geht.

Wie kann ich dieses Objekt erstellen und Schlüssel-Wert-Paare dynamisch hinzufügen?

Ich habe es versucht:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

Aber das funktioniert nicht.

  • Es funktioniert großartig. console.log(vars); zeig mir[ Object key: “newkey” value: “newvalue” proto: Object ]

    – Alex Pliutau

    25. August 2011 um 19:42 Uhr


  • Abgesehen davon, dass es sich um eine Liste handelt, nicht um ein Wörterbuch :\ Ich denke, die Daten lassen sich auch besser als Liste von „Paaren“ darstellen list = [["key1","value1"],["key2","value2"]]. Einige andere Sprachen haben einen „Paar“- oder „Tupel“-Typ. tldr für das tatsächliche Diktat, das hinzufügt: dict['key'] = "value"

    – Jordan Stewart

    19. März 2020 um 11:36 Uhr


Flambinos Benutzeravatar
Flambino

Verwenden:

var dict = []; // Create an empty array

dict.push({
    key:   "keyName",
    value: "the value"
});
// Repeat this last part as needed to add more key/value pairs

Im Grunde erstellen Sie ein Objektliteral mit zwei Eigenschaften (genannt key Und value) und einfügen (mit push()) in das Array.


Dadurch wird kein „normales“ JavaScript-Objektliteral (auch bekannt als Karte, Hash oder Wörterbuch) erstellt. Es Ist Erstellen Sie jedoch die Struktur, nach der OP gefragt hat (und die in der anderen verlinkten Frage veranschaulicht wird). ein Array von Objektliteralenjeder mit key Und value Eigenschaften. Fragen Sie mich nicht, warum diese Struktur erforderlich war, aber es ist diejenige, nach der gefragt wurde.

Aber, aber, wenn das, was Sie in einem einfachen JavaScript-Objekt wollen – und nicht die Struktur, nach der OP gefragt hat – siehe Antwort von tcll, obwohl die Klammernotation etwas umständlich ist, wenn Sie nur einfache Schlüssel haben, die gültige JavaScript-Namen sind. Sie können einfach Folgendes tun:

// Object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

Oder verwenden Sie die reguläre Punktnotation, um Eigenschaften nach dem Erstellen eines Objekts festzulegen:

// Empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.

Du Tun Sie möchten die Klammernotation, wenn Sie Schlüssel haben, die Leerzeichen, Sonderzeichen oder ähnliches enthalten. Z.B:

var dict = {};

// This obviously won't work
dict.some invalid key (for multiple reasons) = "value1";

// But this will
dict["some invalid key (for multiple reasons)"] = "value1";

Sie möchten auch die Klammernotation, wenn Ihre Schlüssel dynamisch sind:

dict[firstName + " " + lastName] = "some value";

Beachten Sie, dass Schlüssel (Eigenschaftsnamen) immer Zeichenfolgen sind und Nicht-Zeichenfolgenwerte in eine Zeichenfolge umgewandelt werden, wenn sie als Schlüssel verwendet werden. ZB, a Date Das Objekt wird in seine String-Darstellung konvertiert:

dict[new Date] = "today's value";

console.log(dict);
// => {
//      "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
//    }

Beachten Sie jedoch, dass dies nicht unbedingt „einfach funktioniert“, da viele Objekte eine Zeichenfolgendarstellung wie haben "[object Object]" was nicht zu einem nicht eindeutigen Schlüssel führt. Seien Sie also vorsichtig bei etwas wie:

var objA = { a: 23 },
    objB = { b: 42 };

dict[objA] = "value for objA";
dict[objB] = "value for objB";

console.log(dict);
// => { "[object Object]": "value for objB" }

Trotz objA Und objB Da es sich um völlig unterschiedliche und einzigartige Elemente handelt, haben beide die gleiche grundlegende Zeichenfolgendarstellung: "[object Object]".

Der Grund Date sich nicht so verhält, ist das Date Prototyp hat einen Brauch toString Methode, die die Standardzeichenfolgendarstellung überschreibt. Und Sie können das Gleiche tun:

// A simple constructor with a toString prototypal method
function Foo() {
  this.myRandomNumber = Math.random() * 1000 | 0;
}

Foo.prototype.toString = function () {
  return "Foo instance #" + this.myRandomNumber;
};

dict[new Foo] = "some value";

console.log(dict);
// => {
//      "Foo instance #712": "some value"
//    }

(Beachten Sie, dass oben a. verwendet wird willkürlich Bei Nummern und Namen kann es immer noch sehr leicht zu Kollisionen kommen. Es dient nur zur Veranschaulichung einer Implementierung von toString.)

Wenn also versucht wird, Objekte als Schlüssel zu verwenden, verwendet JavaScript die Schlüssel des Objekts toString Implementierung, falls vorhanden, oder verwenden Sie die Standard-String-Darstellung.

  • @CsabaToth Nein, dict ist kein assoziatives Wörterbuch. Es handelt sich um ein Array von Objekten, von denen jedes ein bisschen wie ein Wörterbuch mit zwei Schlüsseln ist: „Schlüssel“ und „Wert“.

    – Roman Starkow

    8. Juli 2015 um 20:13

  • Was Sie dort haben, ist ein Array, das lediglich den Namen „dict“ trägt.

    – Jan Kyu Peblik

    7. August 2018 um 16:52 Uhr

  • Schätzen Sie das Update und verfolgen Sie weitere Informationen.

    – Jacob

    5. Mai 2019 um 14:25 Uhr

Tclls Benutzeravatar
Tcll

Verwenden:

var dict = {};

dict['key'] = "testing";

console.log(dict);

Es funktioniert genau wie Python 🙂

Konsolenausgabe:

Object {key: "testing"}

  • Dies ist sicherlich der beste Ansatz zum Erstellen eines Wörterbuchs und die richtige Antwort!

    – Römisch

    10. März 2015 um 19:02 Uhr

  • Es ist sehr wichtig, mit Klammern zu initialisieren {} statt Klammern

    – Jaider

    7. Okt. 2015 um 20:19 Uhr


  • Ich verwende auch einfache Objekte als solche Wörterbücher. Ich bin froh zu sehen, dass das der richtige Weg ist!

    – TKoL

    2. Februar 2016 um 10:13

  • „Schönheit“ von Javascript! Das Objekt ist eigentlich selbst ein Schlüssel-Wert-Paar-Wörterbuch

    – 100r

    24. Januar 2018 um 11:27

  • @Azurespot Der Schlüssel kann alles sein, was hashbar ist. Die Schlüssel werden schließlich nach Hash geordnet, was in Python3 bei jedem Lauf unterschiedlich ist.

    – Tcll

    15. August 2019 um 9:55 Uhr


Benutzeravatar von Simon Sarris
Simon Sarris

Es ist so einfach wie:

var blah = {}; // Make a new dictionary (empty)

oder

var blah = {key: value, key2: value2}; // Make a new dictionary with two pairs 

Dann

blah.key3 = value3; // Add a new key/value pair
blah.key2; // Returns value2
blah['key2']; // Also returns value2

  • @KenEucker Ich denke, es ist nützlich, bei Fragen wie dieser falsche Antworten zu haben. Besonders wenn jemand erklärt, warum er falsch liegt, ist das eine gute Lernressource.

    – CJBrew

    28. September 2016 um 11:12 Uhr

Da Sie angegeben haben, dass Sie ein Wörterbuchobjekt wünschen (und kein Array Ich gehe davon aus, dass einige es verstanden haben.) Ich denke, das ist es, wonach Sie suchen:

var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];

var result = {};

for(var i = 0; i < input.length; i++)
{
    result[input[i].key] = input[i].value;
}

console.log(result); // Just for testing

JavaScripts Object Ist an sich wie ein Wörterbuch. Das Rad muss nicht neu erfunden werden.

var dict = {};

// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:key value:value
  // key:anotherKey value:anotherValue
}

// Non existent key
console.log(dict.notExist); // undefined

// Contains key?
if (dict.hasOwnProperty('key')) {
  // Remove item
  delete dict.key;
}

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:anotherKey value:anotherValue
}

Geige

  • Aber mit Einschränkungen, welche Werte die Schlüssel annehmen können? Reservierte Wörter usw.?

    – Peter Mortensen

    16. April um 17:56 Uhr

Pangs Benutzeravatar
Stich

Sie können Karten mit verwenden Mapso was:

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');

  • Aber mit Einschränkungen, welche Werte die Schlüssel annehmen können? Reservierte Wörter usw.?

    – Peter Mortensen

    16. April um 17:56 Uhr

Benutzer-Avatar von Peter Mortensen
Peter Mortensen

Mit ES6du kannst das:

let cake="🍰";

let pan = {
  [cake]: '🥞',
};

// Output -> { '🍰': '🥞' }

Alter Weg (Vanille-JavaScript)

let cake="🍰";
let pan = {};
pan[cake] = '🥞';

// Output -> { '🍰': '🥞' }

  • Ich mag diese Lösung, da sie für die moderne Zeit aktualisiert und ziemlich elegant ist. Danke für Ihren Beitrag. Dies wäre eine gültige Lösung für das gewesen, was ich damals brauchte.

    – KenEucker

    7. Dezember 2020 um 3:58

1454670cookie-checkSo erstellen Sie ein Wörterbuch und fügen Schlüssel-Wert-Paare dynamisch in JavaScript hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy