来自帖子:
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";
但这不起作用。
答案 0 :(得分:448)
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对象文字(又名地图,又名哈希,又名字典)。
它是然而创建了OP要求的结构(以及链接到的另一个问题中说明的结构),它是一个对象文字数组,每个都有{{1 }和key
属性。不要问我为什么需要这种结构,但这是被要求的结构。
但是,但是,如果你想要一个简单的JS对象 - 而不 OP要求的结构 - 请参阅tcll's answer,尽管如果你只是括号表示法有点麻烦有简单的键是有效的JS名称。你可以这样做:
value
或者在创建对象后使用常规点符号设置属性:
// object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
你做想要括号表示法,如果你的键中有空格,特殊字符或类似的东西。 E.g:
// 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"
// }
的实现。)
因此,当尝试将对象用作键时,JS将使用对象自己的toString
实现(如果有),或使用默认字符串表示。
答案 1 :(得分:358)
var dict = {};
dict['key'] = "testing";
console.log(dict);
就像python一样工作:)
控制台输出:
Object {key: "testing"}
答案 2 :(得分:52)
简单如下:
var blah = {}; // make a new dictionary (empty)
或
var blah = {key: value, key2: value2}; // make a new dictionary with two pairs
然后
blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2
答案 3 :(得分:32)
既然你已经声明你想要一个字典对象(并且不是一个数组就像我假设有一些理解那样),我认为这就是你所追求的:
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
答案 4 :(得分:21)
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
}
答案 5 :(得分:11)
您可以使用Map
的地图,如下所示:
var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
答案 6 :(得分:9)
我碰巧在这个问题上寻找类似的东西。它给了我足够的信息来运行测试以获得我想要的答案。因此,如果其他人想知道如何在JavaScript对象中动态添加或查找{key:&#39; value&#39;}对,则此测试应该告诉您可能需要知道的所有内容。
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' }
答案 7 :(得分:8)
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
答案 8 :(得分:4)
您可以创建一个类Dictionary,以便轻松地与Dictionary列表进行交互:
class Dictionary {
constructor() {
this.items = {};
}
has(key) {
return key in this.items;
}
set(key,value) {
this.items[key] = value;
}
delete(key) {
if( this.has(key) ){
delete this.items[key]
return true;
}
return false;
}
}
var d = new Dictionary();
d.set(1, "value1")
d.set(2, "value2")
d.set(3, "value3")
console.log(d.has(2));
d.delete(2);
console.log(d.has(2));
&#13;
答案 9 :(得分:2)
如果有人需要动态创建字典对象,您可以使用以下代码片段
let vars = [{key:"key", value:"value"},{key:"key2", value:"value2"}];
let dict={}
vars.map(varItem=>{
dict[varItem.key]=varItem.value
})
console.log(dict)
答案 10 :(得分:2)
在 ES6 中,您可以执行以下操作:
let cake = '?';
let pan = {
[cake]: '?',
};
// Output -> { '?': '?' }
旧方式
let cake = '?';
let pan = {};
pan[cake] = '?';
// Output -> { '?': '?' }
答案 11 :(得分:2)
在现代javascript(ES6 / ES2015)中,应该将Map数据结构用于字典。 ES6中的Map数据结构使您可以将任意值用作键。
const map = new Map();
map.set("true", 1);
map.set("false", 0);
在您仍在使用ES5的情况下,创建字典的正确方法是按照以下方式创建没有原型的对象。
var map = Object.create(null);
map["true"]= 1;
map["false"]= 0;
创建没有原型对象的字典有很多优点。下面的博客值得一读。
答案 12 :(得分:2)
用于创建键值对的单行程如何?
let result = { ["foo"]: "some value" };
和一些像reduce
这样的迭代器函数可以动态地将数组转换为字典
var options = [
{ key: "foo", value: 1 },
{ key: "bar", value: {id: 2, name: "two"} },
{ key: "baz", value: {["active"]: true} },
];
var result = options.reduce((accumulator, current) => {
accumulator[current.key] = current.value;
return accumulator;
}, {});
console.log(result);
答案 13 :(得分:2)
我遇到了这个问题..但是在for循环中。顶级解决方案不起作用(当使用变量(而不是字符串)作为push函数的参数时),其他解决方案没有考虑基于变量的键值。我很惊讶这种方法(这在php中很常见)有效。
// example dict/json
var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
'record_identifier_2': {'content':'Some different content','title':'Title of my another Record'} };
var array = [];
// key to reduce the 'record' to
var reduceKey = 'title';
for(key in iterateDict)
// ultra-safe variable checking...
if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
// build element to new array key
array[key]=iterateDict[key][reduceKey];
答案 14 :(得分:2)
知道你最终想要的结果会有多大帮助,但我认为这就是你想要的:
var vars = [{key:"key", value:"value"}];
vars.push({key: "newkey", value: "newvalue"})
答案 15 :(得分:1)
var dict = {}
的改进是使用var dict = Object.create(null)
。
这将创建一个空对象,不拥有Object.prototype
原型。
var dict1 = {};
if (dict1["toString"]){
console.log("Hey, I didn't put that there!")
}
var dict2 = Object.create(null);
if (dict2["toString"]){
console.log("This line won't run :)")
}
答案 16 :(得分:1)
全局第一个初始化数组
var dict = []
将对象添加到字典中
dict.push(
{ key: "One",value: false},
{ key: "Two",value: false},
{ key: "Three",value: false});
Output :
[0: {key: "One", value: false}
1: {key: "Two", value: false}
2: {key: "Three", value: false}]
从字典更新对象
Object.keys(dict).map((index) => {
if (index == 1){
dict[index].value = true
}
});
Output :
[0: {key: "One", value: false},
1: {key: "Two", value: true},
2: {key: "Three", value: false}]
从字典中删除对象
Object.keys(dict).map((index) => {
if (index == 2){
dict.splice(index)
}
});
Output :
[0: {key: "One", value: false},
1: {key: "Two", value: true}]