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

Lesezeit: 6 Minuten

Benutzeravatar von KenEucker
KenEucker

Aus dem Beitrag:

Senden eines JSON-Arrays, das als Dictionary empfangen werden soll

Ich versuche dasselbe wie in diesem Beitrag, das einzige Problem ist, dass ich nicht weiß, was die Schlüssel und die Werte im Voraus sind. Also muss ich in der Lage sein, die Schlüssel- und Wertpaare dynamisch hinzuzufügen, und ich weiß nicht, wie das geht.

Weiß jemand, wie man dieses Objekt erstellt und Schlüssel-Wert-Paare dynamisch hinzufügt?

Ich habe es versucht:

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

Aber das geht 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 werden auch besser als Liste von “Paaren” dargestellt, wie z list = [["key1","value1"],["key2","value2"]]. Einige andere Sprachen haben einen „Paar“- oder „Tupel“-Typ. tldr für das eigentliche Hinzufügen von Diktaten: dict['key'] = "value"

    – Jordan Stewart

    19. März 2020 um 11:36 Uhr


Benutzeravatar von Flambino
Flambino

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 2 Eigenschaften (namens key und value) und Einfügen (mit push()) in das Array.


Bearbeiten: Fast 5 Jahre später erhält diese Antwort also Ablehnungen, weil sie kein “normales” JS-Objektliteral (auch bekannt als Karte, alias Hash, alias Wörterbuch) erstellt.
Es ist jedoch die Struktur zu schaffen, die OP gefordert hat (und die in der anderen Frage, mit der verknüpft ist, veranschaulicht wird), die ist ein Array von Objektliteralenjeder mit key und value Eigenschaften. Fragen Sie mich nicht, warum diese Struktur erforderlich war, aber es ist die, nach der gefragt wurde.

Aber, aber, wenn Sie das in einem einfachen JS-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 JS-Namen sind. Sie können einfach dies tun:

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

Oder verwenden Sie die normale 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 wollen die Klammernotation, wenn Sie Tasten 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 Klammernotation, wenn Ihre Schlüssel dynamisch sind:

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

Beachten Sie, dass Schlüssel (Eigenschaftsnamen) immer Zeichenfolgen sind und Werte, die keine Zeichenfolge sind, in eine Zeichenfolge umgewandelt werden, wenn sie als Schlüssel verwendet werden. zB ein Date Objekt wird in seine Zeichenfolgendarstellung 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 keinen nicht eindeutigen Schlüssel ergibt. 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 sie völlig unterschiedliche und einzigartige Elemente sind, haben sie beide die gleiche grundlegende Zeichenfolgendarstellung: "[object Object]".

Der Grund Date verhält sich nicht so, dass die Date Prototyp hat eine Gewohnheit toString -Methode, die die standardmäßige Zeichenfolgendarstellung überschreibt. Und Sie können dasselbe 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, da oben a zufällig Nummer kann es dennoch sehr leicht zu Namenskollisionen kommen. Es dient nur zur Veranschaulichung einer Implementierung von toString.)

Wenn Sie also versuchen, Objekte als Schlüssel zu verwenden, verwendet JS die eigenen des Objekts toString -Implementierung, falls vorhanden, oder verwenden Sie die standardmäßige Zeichenfolgendarstellung.

  • @CsabaToth Nein, dict ist kein assoziatives Wörterbuch. Es ist 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 Uhr

  • Was Sie dort haben, ist ein Array, das nur “dict” heißt.

    – Jan Kyu Peblik

    7. August 2018 um 16:52 Uhr

  • Schätzen Sie das Update und verfolgen Sie zusätzliche Informationen.

    – Jacob

    5. Mai 2019 um 2:25 Uhr

Benutzeravatar von Tcll
Tcll

var dict = {};

dict['key'] = "testing";

console.log(dict);

funktioniert genau wie Python 🙂

Konsolenausgabe:

Object {key: "testing"} 

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

    – Römisch

    10. März 2015 um 19:02 Uhr

  • Sehr wichtig mit Klammern zu initialisieren {} statt Klammern

    – Jaider

    7. Oktober 2015 um 20:19 Uhr


  • Ich verwende auch einfache Objekte als Wörterbücher wie dieses. Schön zu sehen, dass das der richtige Weg ist!

    – TKoL

    2. Februar 2016 um 10:13 Uhr

  • ‘Schönheit’ von Javascript! Objekt IST eigentlich selbst ein Schlüssel-Wert-Paar-Wörterbuch

    – 100r

    24. Januar 2018 um 11:27 Uhr

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

    – Tcll

    15. August 2019 um 9:55 Uhr


Benutzeravatar von Simon Sarris
Simon Sarri

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 solchen Fragen falsche Antworten zu haben. Besonders wenn jemand erklärt, warum er falsch liegt, ist es eine gute Lernressource.

    – CJBrew

    28. September 2016 um 11:12 Uhr

Da Sie angegeben haben, dass Sie ein Dictionary-Objekt (und kein Array wie ich annehme, einige haben es verstanden) 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

Pangs Benutzeravatar
Stich

Sie können Karten mit verwenden Mapso was:

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

Mit ES6du kannst das:

let cake="🍰";

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

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

Alter Weg (Vanille js)

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 Uhr

1422910cookie-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