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

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个属性(称为keyvalue)并将其(使用push())插入到数组中的对象文字.


编辑:所以差不多5年后,这个答案正在下降,因为它没有创建一个"正常"的JS对象文字(又名地图,又名哈希,又名字典).
然而创建OP要求的结构(和其在连接到其他问题示出),这是对象文字的阵列,每个具有keyvalue性质.不要问我为什么需要这种结构,但它是被要求的结构.

但是,但是,如果你想要一个普通的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实现(如果有),或使用默认字符串表示.

  • 你所拥有的只是一个名为“dict”的数组。 (4认同)
  • 感谢更新并跟进额外信息。 (4认同)
  • 这是联想的吗? (2认同)
  • @CsabaToth 不,`dict` 不是关联字典。它是一个对象数组,每个对象都有点像带有两个键的字典:“key”和“value”。 (2认同)

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)

  • javascript的'美'!对象IS实际上是一个键值对字典本身 (5认同)
  • 这当然是构建字典的最佳方法,而且是正确的答案! (3认同)
  • 使用括号`{}`初始化非常重要,而不是括号 (3认同)

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)

  • 除非我误解了Dictionary对象是什么,否则你的问题会产生误导.如何从数组中按键检索值? (2认同)

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)


use*_*449 9

我碰巧在这个问题上寻找类似的东西.它给了我足够的信息来运行测试以获得我想要的答案.因此,如果其他人想知道如何在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)

  • 这不是一个问题.你应该做的是问问题,然后自己回答.这将更容易理解和组织. (2认同)
  • 谢谢@SalmonKiller,我不确定是否有正确的术语来写我自己的问题并希望它能被理解,但后来我在搜索中遇到了这个问题,所有信息都在那里,但分散在几个答案之间,所以我在一个答案中回答了这个问题的概念这样就可以为其他偶然发现这个问题并寻找与我相同的东西的人解答 (2认同)

Sha*_*der 8

var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
Run Code Online (Sandbox Code Playgroud)


Pra*_*hal 7

首先全局初始化数组:

\n
var dict = []\n
Run Code Online (Sandbox Code Playgroud)\n

将对象添加到字典中

\n
dict.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

从字典中更新对象

\n
Object.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

从字典中删除一个对象

\n
Object.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)


Jyo*_*Pal 5

在现代 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)

创建没有原型对象的字典有很多优点。关于这个主题,下面的博客值得一读。

字典模式

对象即地图


Jun*_*aid 5

使用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)