首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何动态创建字典和添加键值对?

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

Stack Overflow用户
提问于 2011-08-26 03:39:10
回答 16查看 1M关注 0票数 398

来自帖子:

Sending a JSON array to be received as a Dictionary

我正试着和那篇文章做同样的事情。唯一的问题是我不知道键和值是什么。所以我需要能够动态地添加键和值对,但我不知道如何做到这一点。

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

我试过了:

代码语言:javascript
运行
复制
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

但这并不管用。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2011-08-26 03:46:40

代码语言:javascript
运行
复制
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())数组中。

编辑:差不多5年后,这个答案被否决了,因为它没有创建一个“正常”的JS对象文字(又称映射,又称散列,又称字典)。

然而,它创建了OP要求的结构(在链接到的另一个问题中进行了说明),这是一个对象文字数组,每个对象文字都具有keyvalue属性。不要问我为什么需要这个结构,但它就是我们所要求的。

但是,但是,如果你想在一个普通的JS对象中使用--而不是OP要求的结构--请参见tcll's answer,尽管如果你只有简单的键作为有效的JS名称,那么括号表示法就有点麻烦了。你可以这样做:

代码语言:javascript
运行
复制
// object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

或者在创建对象后使用常规的点符号来设置属性:

代码语言:javascript
运行
复制
// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.

如果您的键中包含空格、特殊字符或诸如此类的内容,那么您确实需要使用括号表示法。例如:

代码语言:javascript
运行
复制
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";

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

代码语言:javascript
运行
复制
dict[firstName + " " + lastName] = "some value";

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

代码语言:javascript
运行
复制
dict[new Date] = "today's value";

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

但是请注意,这并不一定“只是工作”,因为许多对象将有一个字符串表示,如"[object Object]",这并不是一个非唯一的键。所以要提防像这样的事情:

代码语言:javascript
运行
复制
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方法,它覆盖了默认的字符串表示。你也可以这样做:

代码语言:javascript
运行
复制
// 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实现(如果有的话),或者使用默认的字符串表示。

票数 658
EN

Stack Overflow用户

发布于 2014-03-11 10:57:54

代码语言:javascript
运行
复制
var dict = {};

dict['key'] = "testing";

console.log(dict);

工作方式与python类似:)

控制台输出:

代码语言:javascript
运行
复制
Object {key: "testing"} 
票数 461
EN

Stack Overflow用户

发布于 2011-08-26 03:46:45

它就像这样简单:

代码语言:javascript
运行
复制
var blah = {}; // make a new dictionary (empty)

代码语言:javascript
运行
复制
var blah = {key: value, key2: value2}; // make a new dictionary with two pairs 

然后

代码语言:javascript
运行
复制
blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2
票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7196212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档