如何将一个键/值对添加到JavaScript对象?

这是我的对象文字:

var obj = {key1: value1, key2: value2}; 

我如何将{key3: value3}添加到对象?

有两种方法可以将新属性添加到对象中:

 var obj = { key1: value1, key2: value2 }; 

使用点符号:

 obj.key3 = "value3"; 

使用方括号表示法:

 obj["key3"] = "value3"; 

当你知道属性的名字时使用第一种forms。 当属性的名称是dynamic确定的时使用第二种forms。 像这个例子一样:

 var getProperty = function (propertyName) { return obj[propertyName]; }; getProperty("key1"); getProperty("key2"); getProperty("key3"); 

一个真正的 JavaScript数组可以使用下面的方法构造:

数组文字符号:

 var arr = []; 

数组构造符号:

 var arr = new Array(); 

你可以使用其中的任何一个(假设key3是你想使用的acutal key)

 arr[ 'key3' ] = value3; 

要么

 arr.key3 = value3; 

如果key3是一个variables,那么你应该这样做:

 var key3 = 'a_key'; var value3 = 3; arr[ key3 ] = value3; 

在此之后,请求arr.a_key将返回value3的值,即文字3

编写大型项目时,我越来越喜欢LoDash / Underscore 。

通过obj['key']obj.key都是纯粹的JavaScript纯粹的答案。 然而,LoDash和Underscore库在处理对象和数组时通常都提供了许多额外的方便function。

.push()用于数组 ,不用于对象 。

根据你在找什么,有两个特定的function,可能是很好的利用和function相似的感觉arr.push() 。 有关更多信息查看文档,他们有一些很好的例子。

_.merge (仅限Lodash)

第二个对象将覆盖或添加到基础对象。 undefined值不被复制。

 var obj = {key1: "value1", key2: "value2"}; var obj2 = {key2:"value4", key3: "value3", key4: undefined}; _.merge(obj, obj2); console.log(obj); // → {key1: "value1", key2: "value4", key3: "value3"} 

_.extend / _.assign

第二个对象将覆盖或添加到基础对象。 undefined将被复制。

 var obj = {key1: "value1", key2: "value2"}; var obj2 = {key2:"value4", key3: "value3", key4: undefined}; _.extend(obj, obj2); console.log(obj); // → {key1: "value1", key2: "value4", key3: "value3", key4: undefined} 

_.defaults

第二个对象包含将被添加到基础对象(如果它们不存在)的默认值。 如果密钥已经存在, undefined值将被复制。

 var obj = {key3: "value3", key5: "value5"}; var obj2 = {key1: "value1", key2:"value2", key3: "valueDefault", key4: "valueDefault", key5: undefined}; _.defaults(obj, obj2); console.log(obj); // → {key3: "value3", key5: "value5", key1: "value1", key2: "value2", key4: "valueDefault"} 

$ .extend

另外,值得一提的是jQuery.extend,它的function类似于_.merge,如果你已经在使用jQuery,可能是更好的select。

第二个对象将覆盖或添加到基础对象。 undefined值不被复制。

 var obj = {key1: "value1", key2: "value2"}; var obj2 = {key2:"value4", key3: "value3", key4: undefined}; $.extend(obj, obj2); console.log(obj); // → {key1: "value1", key2: "value4", key3: "value3"} 

Object.assign()

可能值得一提的是ES6 / ES2015的Object.assign,它的function与_.merge类似,如果你已经使用了像Babel这样的ES6 / ES2015 polyfill,如果你想自己填充,可能是最好的select。

第二个对象将覆盖或添加到基础对象。 undefined将被复制。

 var obj = {key1: "value1", key2: "value2"}; var obj2 = {key2:"value4", key3: "value3", key4: undefined}; Object.assign(obj, obj2); console.log(obj); // → {key1: "value1", key2: "value4", key3: "value3", key4: undefined} 
 arr.key3 = value3; 

因为你的arr不是一个真正的数组…这是一个原型对象。 真正的数组将是:

 var arr = [{key1: value1}, {key2: value2}]; 

但还是不对 实际上应该是:

 var arr = [{key: key1, value: value1}, {key: key2, value: value2}]; 
 var employees = []; employees.push({id:100,name:'Yashwant',age:30}); employees.push({id:200,name:'Mahesh',age:35}); 

我知道已经有一个可以接受的答案,但是我想我会在某个地方logging我的想法。 请[人们]随意在这个想法中钻空子,因为我不知道这是否是最好的解决scheme……但是我几分钟前就把它们放在了一起:

 Object.prototype.push = function( key, value ){ this[ key ] = value; return this; } 

你可以这样使用它:

 var obj = {key1: value1, key2: value2}; obj.push( "key3", "value3" ); 

因为原型函数正在返回this函数, this你可以继续将.pushobjvariables的末尾: obj.push(...).push(...).push(...);

另一个特性是你可以传递一个数组或另一个对象作为push函数参数中的值。 看我的小提琴一个工作的例子: http : //jsfiddle.net/7tEme/

你可以用@IonuţG. Stan的答案创build一个类

 function obj(){ obj=new Object(); this.add=function(key,value){ obj[""+key+""]=value; } this.obj=obj } 

用最后一个类创build一个新的对象:

 my_obj=new obj(); my_obj.add('key1', 'value1'); my_obj.add('key2', 'value2'); my_obj.add('key3','value3'); 

打印对象

 console.log(my_obj.obj) // Return {key1: "value1", key2: "value2", key3: "value3"} 

打印一个键

 console.log(my_obj.obj["key3"]) //Return value3 

我在JavaScript新手,欢迎评论。 为我工作。

大多数答案中已经提到了两种最常用的方法

 obj.key3 = "value3"; obj["key3"] = "value3"; 

另一种定义属性的方法是使用Object.defineProperty()

 Object.defineProperty(obj, 'key3', { value: "value3", // undefined by default enumerable: true, // false by default configurable: true, // false by default writable: true // false by default }); 

当你想在定义属性的时候有更多的控制权,这个方法很有用。 定义的属性可以设置为可枚举,可由用户configuration和写入。

你的例子显示了一个对象,而不是一个数组。 在这种情况下,将一个字段添加到Object的首选方法就是分配给它,如下所示:

 arr.key3 = value3; 

如果你在一个对象中有多个匿名的对象文字,并且想要添加另一个包含键/值对的对象,可以这样做:

“萤火虫”的对象:

 console.log(Comicbook); 

收益:

对象{name =“Spiderman”,value =“11”},Object {name =“Marsipulami”,value =“18”},Object {name =“Garfield”,value =“2”}]

码:

 if (typeof Comicbook[3]=='undefined') { private_formArray[3] = new Object(); private_formArray[3]["name"] = "Peanuts"; private_formArray[3]["value"] = "12"; } 

将向Comicbook对象添加Object {name="Peanuts", value="12"}

obj['key3'] = value3obj.key3 = value3会将新的对添加到obj

不过,我知道jQuery没有提到,但如果你使用它,你可以通过$.extend(obj,{key3: 'value3'})来添加对象。 例如:

 var obj = {key1: 'value1', key2: 'value2'}; $('#ini').append(JSON.stringify(obj)); $.extend(obj,{key3: 'value3'}); $('#ext').append(JSON.stringify(obj)); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p id="ini">Initial: </p> <p id="ext">Extended: </p> 

你可以这样添加它:

 arr['key3'] = value3; 

或者这样:

 arr.key3 = value3; 

如果key3的值是'key3'那么只有在用key3键入对象时才会有效。

根据ECMA-262( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,P67 )中定义的属性 访问器 ,有两种方法可以将属性添加到一个存在的对象。 所有这两种方式,Javascript引擎都会对待它们。

第一种方法是使用点符号:

 obj.key3 = value3; 

但是这样,你应该在点符号后使用一个IdentifierName

第二种方法是使用括号表示法:

 obj["key3"] = value3; 

另一种forms:

 var key3 = "key3"; obj[key3] = value3; 

这样,可以在括号表示中使用expression式 (包括标识符名称 )。

我们也可以这样做。

 var myMap = new Map(); myMap.set(0, 'my value1'); myMap.set(1, 'my value2'); for (var [key, value] of myMap) { console.log(key + ' = ' + value); } 

2017年答案

Object.assign(dest,src1,src2,…)合并对象。

它用属性和值(不pipe多less)源对象覆盖dest ,然后返回dest

Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。 它会返回目标对象。

现场示例

 var obj = {key1: "value1", key2: "value2"}; Object.assign(obj, {key3: "value3"}); document.body.innerHTML = JSON.stringify(obj); 

为了将一个键值对添加到一个对象中,所以与该元素一起工作的for首先执行此操作:

  var nwrow = {'newkey': 'value' }; for(var column in row){ nwrow[column] = row[column]; } row = nwrow; 
 arr.push({key3: value3});