javascript - 如何在Javascript中动态创建字典和添加键值对

标签 javascript dictionary key-value

来自帖子:

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

基本上,您正在创建一个具有 2 个属性(称为 keyvalue)的对象字面量并插入它(使用 push() ) 到数组中。


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

但是,但是,如果你想要一个普通的 JS 对象 - 而 不是 OP 要求的结构 - 请参阅 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 原型(prototype)有一个自定义的 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"
//    }

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

所以当尝试使用对象作为键时,JS 将使用对象自己的 toString 实现,如果有的话,或者使用默认的字符串表示。

关于javascript - 如何在Javascript中动态创建字典和添加键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196212/

相关文章:

javascript - 使用 xhr 上传文件时在哪里以及如何设置正确的编码

javascript - 使用函数式编程范例迭代链表

javascript - 如何修复滞后的背景附件 :fixed in Safari?

c++ - 在 C++ 中实现 map<mpz_t, double>

swift - 如何从 swift 字典中删除键值对?

c# - 有什么方法可以直接在 .NET 中更新 Dictionary 的 Key 元素吗?

javascript - 为什么 JavaScript 通过引用传递?

javascript - 如何循环遍历 Javascript 中的键/值对象?

delphi - 具有更多列的 TValueListEditor

vba - Excel VBA - 字典.Exists(字典)?