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

时间:2011-08-25 19:39:10

标签: javascript dictionary key-value

来自帖子:

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

但这不起作用。

17 个答案:

答案 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个属性(称为keyvalue)并将其插入(使用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
}

Fiddle

答案 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列表进行交互:

&#13;
&#13;
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;
&#13;
&#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;

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

dict-pattern

objects-as-maps

答案 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}]