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.
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.
Verwenden:
var dict = {};
dict['key'] = "testing";
console.log(dict);
Es funktioniert genau wie Python 🙂
Konsolenausgabe:
Object {key: "testing"}
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
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
Sie können Karten mit verwenden Map
so 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-JavaScript)
let cake="🍰";
let pan = {};
pan[cake] = '🥞';
// Output -> { '🍰': '🥞' }
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