Ken*_*ker 291 javascript dictionary key-value
从帖子:
发送要作为Dictionary <string,string>接收的JSON数组
我正在尝试做同样的事情.唯一的问题是我不知道密钥和值是什么.所以我需要能够动态添加键和值对,我不知道该怎么做.
有谁知道如何创建该对象并动态添加键值对?
我试过了:
var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
Fla*_*ino 501
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
Run Code Online (Sandbox Code Playgroud)
基本上,您正在创建一个具有2个属性(称为key
和value
)并将其(使用push()
)插入到数组中的对象文字.
编辑:所以差不多5年后,这个答案正在下降,因为它没有创建一个"正常"的JS对象文字(又名地图,又名哈希,又名字典).
它被然而创建OP要求的结构(和其在连接到其他问题示出),这是对象文字的阵列,每个具有key
和value
性质.不要问我为什么需要这种结构,但它是被要求的结构.
但是,但是,如果你想要一个普通的JS对象 - 而不是 OP要求的结构 - 请参阅tcll的答案,尽管括号表示法有点麻烦,如果你只有简单的密钥是有效的JS名称.你可以这样做:
// object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
Run Code Online (Sandbox Code Playgroud)
或者在创建对象后使用常规点符号设置属性:
// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.
Run Code Online (Sandbox Code Playgroud)
如果您有包含空格的键,特殊字符或类似的东西,您确实需要括号表示法.例如:
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";
Run Code Online (Sandbox Code Playgroud)
如果您的键是动态的,您还需要括号表示法:
dict[firstName + " " + lastName] = "some value";
Run Code Online (Sandbox Code Playgroud)
请注意,键(属性名称)始终是字符串,非字符串值在用作键时将强制转换为字符串.例如,Date
对象转换为其字符串表示形式:
dict[new Date] = "today's value";
console.log(dict);
// => {
// "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
// }
Run Code Online (Sandbox Code Playgroud)
但请注意,这并不一定"只是工作",因为许多对象将具有字符串表示"[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" }
Run Code Online (Sandbox Code Playgroud)
尽管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"
// }
Run Code Online (Sandbox Code Playgroud)
(注意,由于上面使用了一个随机数,名称冲突仍然可以很容易地发生.这只是为了说明一个实现toString
.)
因此,当尝试使用对象作为键时,JS将使用对象自己的toString
实现(如果有),或使用默认字符串表示.
Tcl*_*cll 384
var dict = {};
dict['key'] = "testing";
console.log(dict);
Run Code Online (Sandbox Code Playgroud)
像python一样工作:)
控制台输出:
Object {key: "testing"}
Run Code Online (Sandbox Code Playgroud)
Sim*_*ris 54
它很简单:
var blah = {}; // make a new dictionary (empty)
Run Code Online (Sandbox Code Playgroud)
要么
var blah = {key: value, key2: value2}; // make a new dictionary with two pairs
Run Code Online (Sandbox Code Playgroud)
然后
blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2
Run Code Online (Sandbox Code Playgroud)
Zen*_*ter 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
Run Code Online (Sandbox Code Playgroud)
Jan*_*nen 22
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
}
Run Code Online (Sandbox Code Playgroud)
小智 11
您可以使用地图Map
,如下所示:
var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
Run Code Online (Sandbox Code Playgroud)
我碰巧在这个问题上寻找类似的东西.它给了我足够的信息来运行测试以获得我想要的答案.因此,如果其他人想知道如何在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);
Run Code Online (Sandbox Code Playgroud)
产量
initialValue
{ initialkey: 'initialValue',
something: 'value1',
somethingElse: 'value2' }
Run Code Online (Sandbox Code Playgroud)
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
Run Code Online (Sandbox Code Playgroud)
首先全局初始化数组:
\nvar dict = []\n
Run Code Online (Sandbox Code Playgroud)\n将对象添加到字典中
\ndict.push(\n { key: "One",value: false},\n { key: "Two",value: false},\n { key: "Three",value: false});\n
Run Code Online (Sandbox Code Playgroud)\n输出:
\n [0:\xc2\xa0{key:\xc2\xa0"One",\xc2\xa0value:\xc2\xa0false}\n 1:\xc2\xa0{key:\xc2\xa0"Two",\xc2\xa0value:\xc2\xa0false}\n 2:\xc2\xa0{key:\xc2\xa0"Three",\xc2\xa0value:\xc2\xa0false}]\n
Run Code Online (Sandbox Code Playgroud)\n从字典中更新对象
\nObject.keys(dict).map((index) => {\n if (index == 1){\n dict[index].value = true\n }\n});\n
Run Code Online (Sandbox Code Playgroud)\n输出:
\n [0:\xc2\xa0{key:\xc2\xa0"One",\xc2\xa0value:\xc2\xa0false},\n 1:\xc2\xa0{key:\xc2\xa0"Two",\xc2\xa0value:\xc2\xa0true},\n 2:\xc2\xa0{key:\xc2\xa0"Three",\xc2\xa0value:\xc2\xa0false}]\n
Run Code Online (Sandbox Code Playgroud)\n从字典中删除一个对象
\nObject.keys(dict).map((index) => {\n if (index == 2){\n dict.splice(index)\n }\n });\n
Run Code Online (Sandbox Code Playgroud)\n输出:
\n [0:\xc2\xa0{key:\xc2\xa0"One",\xc2\xa0value:\xc2\xa0false},\n 1:\xc2\xa0{key:\xc2\xa0"Two",\xc2\xa0value:\xc2\xa0true}]\n
Run Code Online (Sandbox Code Playgroud)\n
小智 6
您可以创建一个类 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));
Run Code Online (Sandbox Code Playgroud)
在现代 javascript (ES6/ES2015) 中,应该使用 Map 数据结构作为字典。ES6 中的 Map 数据结构允许您使用任意值作为键。
const map = new Map();
map.set("true", 1);
map.set("false", 0);
Run Code Online (Sandbox Code Playgroud)
在你还在使用 ES5 的情况下,创建字典的正确方法是按照以下方式创建没有原型的对象。
var map = Object.create(null);
map["true"]= 1;
map["false"]= 0;
Run Code Online (Sandbox Code Playgroud)
创建没有原型对象的字典有很多优点。关于这个主题,下面的博客值得一读。
使用ES6,你可以这样做:
let cake = '';
let pan = {
[cake]: '',
};
// Output -> { '': '' }
Run Code Online (Sandbox Code Playgroud)
旧方式(香草js)
let cake = '';
let pan = {};
pan[cake] = '';
// Output -> { '': '' }
Run Code Online (Sandbox Code Playgroud)