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


323

从帖子:

发送一个JSON数组作为Dictionary <string,string>接收

我正在尝试与此职位做同样的事情。唯一的问题是我不知道什么键和值是预先的。因此,我需要能够动态添加键和值对,但我不知道该怎么做。

有谁知道如何创建该对象并动态添加键值对?

我试过了:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

但这是行不通的。


2
效果很好。console.log(vars); 显示我[对象键:“ newkey”值:“ newvalue” 原型:对象]
Alex Pliutau 2011年

除了它是一个列表,而不是字典:\我认为数据也更好地表示为“对”列表,例如list = [["key1","value1"],["key2","value2"]]。其他一些语言具有“对”或“元组”类型。tldr的实际命令添加:dict['key'] = "value"
乔丹·斯图尔特

Answers:


551
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对象文字(aka地图,aka哈希,aka字典)。但是,
正在创建OP要求的结构(在另一个链接的问题中对此进行了说明),该结构是一组对象常量,每个对象都有keyvalue属性。不要问我为什么需要这种结构,但这是所要求的。

但是,但是,如果您想要一个普通的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" }

尽管objAobjB是完全不同的,独特的元素,它们都具有相同的基本字符串表示:"[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实现(如果有)或使用默认的字符串表示形式。


2
那是联想吗?
Csaba Toth 2015年

1
@CsabaToth不,dict不是关联词典。它是一个对象数组,每个对象有点像带有两个键的字典:“键”和“值”。
罗曼·斯塔科夫

1
您拥有的只是一个名为“ dict”的数组。
Jan Kyu Peblik

2
赞赏更新并跟进其他信息。
雅各布

410
var dict = {};

dict['key'] = "testing";

console.log(dict);

就像python一样工作:)

控制台输出:

Object {key: "testing"} 

3
当然,这是构建词典的最佳方法,并且是正确的答案!
罗马

3
用方括号{}而不是括号进行初始化非常重要
Jaider 2015年

我也像这样使用基本对象作为字典。很高兴看到这是正确的方法!
TKoL '16

5
JavaScript的“美丽”!对象实际上是键值对字典本身
100:r

1
@Azurespot密钥可以是任何可哈希的,密钥毕竟是按哈希排序的,这在python3中每次运行都不同。
Tcll

54

它很简单:

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

1
@KenEucker我认为在这样的问题中给出错误答案很有用。特别是如果有人解释了他们为什么做错了,这是一个很好的学习资源。
CJBrew

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

使用.push到数组中的另一种解决方案可以满足我的需求,但是我认为如果尝试也可以。
KenEucker 2011年

2
除非我误解了Dictionary对象是什么,否则您的问题就会引起误解。您将如何通过键从数组中检索值?
ZenMaster 2011年

我在此对象上使用JSON.stringify,然后使用MVC 3中的控制器捕获它。这样做的目的是为了在对它进行字符串化和发送之前对其进行正确格式化。
KenEucker 2011年

23

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
}

小提琴


11

您可以将地图与一起使用Map,如下所示:

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');

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);

输出

initialValue
{ initialkey: 'initialValue',
  something: 'value1',
  somethingElse: 'value2' }

2
这不是问题。相反,您应该问的是问题,然后自己回答。这将更容易理解和组织。
SalmonKiller 2015年

1
谢谢@SalmonKiller我不确定要写我自己的问题并希望它能被理解的术语,但是后来我在搜索中碰巧遇到了所有信息,但是分散在几个答案之间,所以我在一个答案中回答了这个问题的概念。对于其他偶然发现此问题并寻找与我相同的事物的人的答案
user2301449 2015年

1
大声笑。我正在对此进行审查,它看起来像是一个问题而不是答案。对不起!
SalmonKiller

感谢您添加此内容。您也可以像上面的答案一样将它放在小提琴中。
KenEucker '16

8
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1

对于某些附加性能,您应该参考key1 = dictionary.key1而不是索引key1 = dictionary["key1"]
Tcll

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));


3

一个用于创建键值对的衬里怎么样?

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);


3

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

创建没有原型对象的字典有许多优点。以下博客值得一读。

字典模式

地图对象


2

大量了解您最终的期望结果是有帮助的,但是我认为这是您想要的:

var vars = [{key:"key", value:"value"}];

vars.push({key: "newkey", value: "newvalue"})

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];

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 :)")
}

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}]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.