发帖:

Sending a JSON array to be received as a Dictionary<string,string>

我正试着做和那篇帖子一样的事情.唯一的问题是我不知道键和值是什么.所以我需要能够动态地添加键和值对,我不知道怎么做.

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

我试过了:

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

但那不管用.

推荐答案

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

基本上,您要创建一个具有两个属性(称为keyvalue)的对象文字,并将其插入(使用push())数组中.


Edit:差不多5年后,这个答案的票数越来越低,因为它没有创建"普通"的JS对象文字(又称映射、又称散列、又称字典).
然而,它is创建了OP要求的 struct (并在链接到的另一个问题中进行了说明),即an array of object literals,每个都有keyvalue个属性.不要问我为什么需要那个 struct ,但它就是我们要求的那个.

但是,如果你想在一个简单的JS对象中得到什么——以及not OP所要求的 struct ——请参见tcll's answer,尽管如果你只有有效的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]".

Date不是这样的原因是因为Date原型有一个自定义的toString方法,它覆盖了默认的字符串表示.你也可以这么做:

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

(请注意,由于上面使用的是random,名称冲突仍然很容易发生.这只是为了说明toString的实现.)

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

Javascript相关问答推荐

JavaScript:循环访问不断变化的数组中的元素

使用TMS Web Core中的HTML模板中的参数调用过程

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

将现场录音发送到后端

阿波罗返回的数据错误,但在网络判断器中是正确的

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

Ember.js 5.4更新会话存储时如何更新组件变量

有条件重定向到移动子域

类构造函数忽略Reaction Native中的可选字段,但在浏览器中按预期工作

在使用REACT更改了CSS类之后,无法更改CSS样式

从另一个数组中的对应行/键值对更新数组中的键值对对象

在FAQ Accodion应用程序中使用React useState时出现问题

触发异步函数后不能显示数据

如何用javascript更改元素的宽度和高度?

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

用于测试其方法和构造函数的导出/导入类

AG-GRIDreact 显示布尔值而不是复选框

Firebase函数中的FireStore WHERE子句无法执行

如何使用fltter_js将对象作为参数传递给javascrip?

Rails 7:在不使用导入映射的情况下导入Java脚本