从文章:
发送一个JSON数组作为Dictionary<string,string>接收
我试图做同样的事情,因为那篇文章,唯一的问题是,我不知道什么键和值是前面。我需要动态添加键和值对,我不知道怎么做。
有人知道如何创建对象并动态添加键值对吗?
我试过了:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
但这行不通。
从文章:
发送一个JSON数组作为Dictionary<string,string>接收
我试图做同样的事情,因为那篇文章,唯一的问题是,我不知道什么键和值是前面。我需要动态添加键和值对,我不知道怎么做。
有人知道如何创建对象并动态添加键值对吗?
我试过了:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
但这行不通。
当前回答
既然你已经声明,你想要一个字典对象(而不是一个数组,像我假设一些理解),我认为这是你想要的:
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
其他回答
JavaScript的Object本身就像一个字典。没有必要重新发明轮子。
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
}
小提琴
我碰巧在寻找类似的东西时遇到了这个问题。它给了我足够的信息来进行测试,以得到我想要的答案。因此,如果有人想知道如何动态地添加或查找JavaScript对象中的{key: 'value'}对,这个测试应该会告诉你所有你可能需要知道的东西。
var dictionary = {initialkey: 'initialValue'};
var key = 'something';
var key2 = 'somethingElse';
var value = 'value1';
var value2 = 'value2';
var keyInitial = 'initialkey';
console.log(dictionary[keyInitial]);
dictionary[key] =value;
dictionary[key2] = value2;
console.log(dictionary);
输出
initialValue
{ initialkey: 'initialValue',
something: 'value1',
somethingElse: 'value2' }
var dict = {};
dict['key'] = "testing";
console.log(dict);
就像python一样工作:)
控制台输出:
Object {key: "testing"}
你可以创建一个类Dictionary,这样你就可以轻松地与Dictionary列表交互:
类字典{ 构造函数(){ 这一点。Items = {}; } (关键){ 在this.items中返回键; } 集(关键字,值){ 这一点。项目[key] = value; } 删除(关键){ If (this.has(key)){ 删除this.items(例子) 返回true; } 返回错误; } } var d = new Dictionary(); d.set(“value1”) “value2 d.set (2) d.set(3,“value3”) console.log (d.has (2)); d.delete (2); console.log (d.has (2));
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个属性(称为key和value)的对象文字,并将其插入(使用push())到数组中。
编辑:所以差不多5年后,这个答案被否决了,因为它没有创建一个“正常”的JS对象文字(又名map,又名hash,又名dictionary)。 然而,它正在创建OP要求的结构(在链接到的另一个问题中有说明),这是一个对象字面量数组,每个数组都具有键和值属性。不要问我为什么需要这种结构,但这就是需要的结构。
但是,但是,如果你想要一个普通的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" }
尽管objA和objB是完全不同和唯一的元素,但它们都有相同的基本字符串表示形式:“[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"
// }
(请注意,由于上面使用的是随机数,名称冲突仍然很容易发生。这只是为了说明toString的实现。)
因此,当试图使用对象作为键时,JS将使用对象自己的toString实现(如果有的话),或者使用默认的字符串表示。