如何创建字典并动态添加键值对?

2022-08-29 23:23:58

从帖子:

发送要作为字典<字符串,字符串>接收的 JSON 数组

我试图做与那篇帖子相同的事情。唯一的问题是我不知道前面的键和值是什么。所以我需要能够动态地添加键和值对,我不知道该怎么做。

有谁知道如何创建该对象并动态添加键值对?

我试过了:

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

但这行不通。


答案 1
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

基本上,您正在创建一个具有 2 个属性(称为 and )的对象文本,并将其插入(使用 )到数组中。keyvaluepush()


编辑:因此,差不多5年后,这个答案被否决了,因为它没有创建一个“正常”的JS对象文字(又名map,又名哈希,又名字典)。
然而,它正在创建OP要求的结构(并在链接到的另一个问题中进行了说明),这是一个对象文本数组,每个文本都有和属性。不要问我为什么需要这种结构,但这是被要求的结构。keyvalue

但是,但是,如果你在一个普通的JS对象中想要什么 - 而不是OP要求的结构 - 请参阅tcll的答案,尽管如果你只有有效的JS名称的简单键,括号符号有点麻烦。你可以这样做:

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

或者在创建对象后使用常规点表示法设置属性:

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

如果您拥有的键中包含空格,特殊字符或类似内容,则确实需要括号表示法。例如:

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";

如果您的键是动态的,您还需要括号表示法:

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

请注意,键(属性名称)始终是字符串,非字符串值在用作键时将被强制转换为字符串。例如,一个对象被转换为它的字符串表示形式:Date

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

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

但请注意,这并不一定“正常工作”,因为许多对象将具有字符串表示形式,例如不会形成非唯一键。因此,请警惕以下情况:"[object Object]"

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" }

尽管是完全不同且唯一的元素,但它们都具有相同的基本字符串表示形式:。objAobjB"[object Object]"

行为不是这样的原因是原型具有一个自定义方法,该方法重写了默认的字符串表示形式。你可以做同样的事情:DateDatetoString

// 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"
//    }

(请注意,由于上述内容使用随机数,因此名称冲突仍然很容易发生。这只是为了说明 的实现。toString

因此,当尝试使用对象作为键时,JS 将使用对象自己的实现(如果有),或者使用默认的字符串表示形式。toString


答案 2
var dict = {};

dict['key'] = "testing";

console.log(dict);

就像python:)一样工作

控制台输出:

Object {key: "testing"}