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.
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.
var dict = {};
dict['key'] = "testing";
console.log(dict);
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 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
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 js)
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 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