1743

这是我的对象文字:

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

如何向对象添加key3字段value3

4

26 回答 26

2754

有两种方法可以向对象添加新属性

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

使用点符号:

obj.key3 = "value3";

使用方括号表示法:

obj["key3"] = "value3";

当您知道属性的名称时,使用第一种形式。第二种形式用于动态确定属性名称时。就像在这个例子中一样:

var getProperty = function (propertyName) {
    return obj[propertyName];
};

getProperty("key1");
getProperty("key2");
getProperty("key3");

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

数组字面量表示法:

var arr = [];

Array 构造函数表示法:

var arr = new Array();
于 2009-07-22T23:25:19.920 回答
535

2017年答案:Object.assign()

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

dest它用(无论多少)源对象的属性和值覆盖,然后返回dest.

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

活生生的例子

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

document.body.innerHTML = JSON.stringify(obj);

2018年答案:对象传播算子{...}

obj = {...obj, ...pair};

来自MDN

它将自己的可枚举属性从提供的对象复制到新对象上。

现在可以使用比Object.assign().

请注意,Object.assign()触发setter而传播语法则不会。

活生生的例子

它适用于当前的 Chrome 和当前的 Firefox。他们说它在当前的 Edge 中不起作用。

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

document.body.innerHTML = JSON.stringify(obj);

2019年答案

对象赋值运算符 +=

obj += {key3: "value3"};

哎呀......我被带走了。从未来走私信息是非法的。妥妥的遮遮掩掩!

于 2017-11-04T23:51:48.773 回答
108

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

添加 by obj['key']orobj.key都是可靠的纯 JavaScript 答案。然而,在使用对象和数组时,LoDash 和 Underscore 库确实提供了许多额外的便利功能。

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

根据您正在寻找的内容,有两个特定的功能可能会很好地利用并提供类似于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,它的功能类似于 _.merge,如果您已经在使用 jQuery,它可能是一个更好的选择。

第二个对象将覆盖或添加到基础对象。 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"}

对象.assign()

值得一提的是 ES6/ES2015 Object.assign,它的功能类似于 _.merge,如果你已经在使用像Babel这样的 ES6/ES2015 polyfill ,如果你想自己进行 polyfill,它可能是最好的选择。

第二个对象将覆盖或添加到基础对象。 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}
于 2014-11-24T18:11:22.310 回答
74

您可以使用其中任何一种(前提是 key3 是您要使用的实际密钥)

arr[ 'key3' ] = value3;

或者

arr.key3 = value3;

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

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

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

于 2009-07-22T23:22:21.657 回答
43

表现

今天 2020.01.14 我在 Chrome v78.0.0、Safari v13.0.4 和 Firefox v71.0.0 上对 MacOs HighSierra 10.13.6 进行测试,以选择解决方案。我将解决方案分为可变(第一个字母 M)和不可变(第一个字母 I)。我还提供了一些尚未在此问题的答案中发布的不可变解决方案(IB、IC、ID/IE)

结论

  • 最快的可变解决方案比最快的不可变解决方案快得多(> 10x)
  • obj.key3 = "abc"像(MA,MB)这样的经典可变方法是最快的
  • 对于不可变的解决方案,{...obj, key3:'abc'}Object.assign(IA,IB) 最快
  • 令人惊讶的是,不可变的解决方案比 chrome (MC-IA) 和 safari (MD-IB) 的一些可变解决方案更快

在此处输入图像描述

细节

在下面的代码段中提供了经过测试的解决方案,您可以在此处预先在您的机器上进行测试(2022 年更新:我非常感谢Josh DeLong,他从 jspref.com 重写了测试,这停止了对 jsbench.me 的工作)

var o = {
    key1: true,
    key2: 3,
};

var log= (s,f)=> console.log(`${s} --> ${JSON.stringify(f({...o}))}`);



function MA(obj) {
  obj.key3 = "abc";
  return obj;
}

function MB(obj) {
  obj['key3'] = "abc";
  return obj;
}

function MC(obj) {
  Object.assign(obj, {key3:'abc'});
  return obj;
}

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

function IA(obj) {
  return {...obj, key3:'abc'};
}

function IB(obj) {
  return Object.assign({key3:'abc'}, obj);
}

function IC(obj) {
  let ob= JSON.parse(JSON.stringify(obj))
  ob.key3 = 'abc';
  return ob;
}


function ID(obj) {
    let ob= Object.fromEntries(Object.entries(obj));
  ob.key3 = 'abc';
  return ob;
}

function IE(obj) {
    return Object.fromEntries(Object.entries(obj).concat([['key3','abc']]))
}



log('MA',MA);
log('MB',MB);
log('MC',MC);
log('MD',MD);
log('IA',IA);
log('IB',IB);
log('IC',IC);
log('ID',ID);
log('IE',IE);
This snippet only presents code - it not perform tests itself!

在此处输入图像描述

于 2020-01-14T17:11:39.933 回答
31
arr.key3 = value3;

因为你的 arr 并不是一个真正的数组......它是一个原型对象。真正的数组是:

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

但这仍然不对。它实际上应该是:

var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
于 2009-07-22T23:25:33.723 回答
25
var employees = []; 
employees.push({id:100,name:'Yashwant',age:30});
employees.push({id:200,name:'Mahesh',age:35});
于 2013-10-27T17:49:39.367 回答
16

扩展运算符是一种有用且快速的语法,用于将项目添加到数组、组合数组或对象以及将数组扩展为函数的参数。现在,ES2018 为对象文字提供了扩展属性。它将自己的可枚举属性从提供的对象复制到新对象上。

扩展语法对于将对象的属性和方法组合成一个新对象很有用:

您可以像这样在对象中添加属性

const obj1 = {hello: ""};
const obj2 = {...obj1, laugh: "" };
console.log('obj1', obj1)
console.log('obj2', obj2)

你也可以像这样组合对象

const objectOne = {hello: ""}
const objectTwo = {world: ""}
const objectThree = {...objectOne, ...objectTwo, laugh: ""}
console.log(objectThree) // Object { hello: "", world: "", laugh: "" }
const objectFour = {...objectOne, ...objectTwo, laugh: () => {console.log("".repeat(5))}}
objectFour.laugh() // 

于 2021-05-12T08:59:25.190 回答
14

只需添加属性:

我们要添加prop2 : 2到这个对象,这些是最方便的选项:

  1. 点运算符:object.prop2 = 2;
  2. 方括号:object['prop2'] = 2;

那么我们使用哪一个呢?

点运算符的语法更简洁,应该用作默认值 (imo)。但是,点运算符不能为对象添加动态键,这在某些情况下非常有用。这是一个例子:

const obj = {
  prop1: 1
}

const key = Math.random() > 0.5 ? 'key1' : 'key2';

obj[key] = 'this value has a dynamic key';

console.log(obj);

合并对象:

当我们想要合并 2 个对象的属性时,这些是最方便的选项:

  1. Object.assign(),将目标对象作为参数,以及一个或多个源对象并将它们合并在一起。例如:

const object1 = {
  a: 1,
  b: 2,
};

const object2 = Object.assign({
  c: 3,
  d: 4
}, object1);

console.log(object2);

  1. 对象扩展运算符...

const obj = {
  prop1: 1,
  prop2: 2
}

const newObj = {
  ...obj,
  prop3: 3,
  prop4: 4
}

console.log(newObj);

我们使用哪一个?

  • 扩展语法不那么冗长,应该将其用作默认 imo。不要忘记将此语法转换为所有浏览器都支持的语法,因为它相对较新。
  • Object.assign()更加动态,因为我们可以访问作为参数传入的所有对象,并且可以在将它们分配给新对象之前对其进行操作。
于 2018-08-16T09:15:56.240 回答
13

我知道已经有一个公认的答案,但我想我会在某个地方记录我的想法。请[人们]随意戳这个想法,因为我不确定这是否是最好的解决方案......但我只是在几分钟前把它放在一起:

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

你可以这样使用它:

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

由于原型函数正在返回this,您可以继续将.push's 链接到obj变量的末尾:obj.push(...).push(...).push(...);

另一个功能是您可以将数组或另一个对象作为推送函数参数中的值传递。请参阅我的小提琴以获取工作示例:http: //jsfiddle.net/7tEme/

于 2013-06-26T18:34:00.997 回答
10

您可以使用@Ionuț G. Stan的答案创建一个类

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

使用最后一个类创建一个新对象:

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新手,欢迎评论。为我工作。

于 2013-12-28T01:34:25.063 回答
9

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

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

当您希望在定义属性时拥有更多控制权时,此方法很有用。定义的属性可以由用户设置为可枚举、可配置和可写。

于 2017-01-13T06:14:37.560 回答
7

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

arr.key3 = value3;
于 2009-07-22T23:25:57.670 回答
7

下一个 Javascript 规范(候选阶段 3)中的一个简短而优雅的方法是:

obj = { ... obj, ... { key3 : value3 } }

可以在Object spread vs Object.assignDr. Axel Rauschmayers 网站上找到更深入的讨论。

自 8.6.0 版以来,它已经在 node.js 中运行。

最新版本中的 Vivaldi、Chrome、Opera 和 Firefox 也知道此功能,但 Mirosoft 直到今天才知道,无论是在 Internet Explorer 还是在 Edge 中。

于 2017-11-25T10:17:41.317 回答
7
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
    var injectObj = {isActive:true, timestamp:new Date()};

    // function to inject key values in all object of json array

    function injectKeyValueInArray (array, keyValues){
        return new Promise((resolve, reject) => {
            if (!array.length)
                return resolve(array);

            array.forEach((object) => {
                for (let key in keyValues) {
                    object[key] = keyValues[key]
                }
            });
            resolve(array);
        })
    };

//call function to inject json key value in all array object
    injectKeyValueInArray(arrOfObj,injectObj).then((newArrOfObj)=>{
        console.log(newArrOfObj);
    });

输出如下: -

[ { name: 'eve',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z },
  { name: 'john',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z },
  { name: 'jane',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z } ]
于 2017-12-16T16:10:44.430 回答
7

大多数浏览器都支持,它检查对象键是否可用,如果可用,它会覆盖现有的键值并且它不可用添加键值

示例 1

let my_object = {};

// now i want to add something in it  

my_object.red = "this is red color";

// { red : "this is red color"}

示例 2

let my_object = { inside_object : { car : "maruti" }}

// now i want to add something inside object of my object 

my_object.inside_object.plane = "JetKing";

// { inside_object : { car : "maruti" , plane : "JetKing"} }

示例 3

let my_object = { inside_object : { name : "abhishek" }}

// now i want to add something inside object with new keys birth , gender 

my_object.inside_object.birth = "8 Aug";
my_object.inside_object.gender = "Male";


    // { inside_object : 
//             { name : "abhishek",
//               birth : "8 Aug",
//               gender : "Male" 
//            }   
//       }
于 2018-11-19T10:05:29.157 回答
7

我们可以通过多种方式将键/值对添加到 JavaScript 对象...

案例 - 1:扩展一个对象
使用它我们可以key: value同时向对象添加多个。

const rectangle = { width: 4, height: 6 };
const cube = {...rectangle, length: 7};
const cube2 = {...rectangle, length: 7, stroke: 2};
  console.log("Cube2: ", cube2);
  console.log("Cube: ", cube);
  console.log("Rectangle: ", rectangle);

案例 - 2:使用dot符号

var rectangle = { width: 4, height: 6 };
rectangle.length = 7;
console.log(rectangle);

案例 - 3:使用[square]符号

var rectangle = { width: 4, height: 6 };
    rectangle["length"] = 7;
    console.log(rectangle);

于 2021-02-11T04:36:19.127 回答
6

我们也可以这样做。

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-09-07T03:36:55.657 回答
5

您可以通过以下方式添加它:

arr['key3'] = value3;

或者这样:

arr.key3 = value3;

建议使用变量键入对象的答案key3仅在值为 is 时才key3有效'key3'

于 2009-07-22T23:33:35.300 回答
5

如果您在一个 Object 中有多个匿名 Object 字面量,并且想要添加另一个包含键/值对的 Object,请执行以下操作:

Firebug' 对象:

console.log(Comicbook);

返回:

[对象 { 名称 =“蜘蛛侠”,值 =“11”},对象 { 名称 =“Marsipulami”,值 =“18”},对象 { 名称 =“加菲猫”,值 =“2”}]

代码:

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

将添加Object {name="Peanuts", value="12"}到漫画书对象

于 2012-08-01T14:28:41.827 回答
5

要么 要么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>

jQuery。extend (target[,object1][,objectN])将两个或多个对象的内容合并到第一个对象中。

它还允许递归添加/修改$.extend(true,object1,object2);

var object1 = {
  apple: 0,
  banana: { weight: 52, price: 100 },
  cherry: 97
};
var object2 = {
  banana: { price: 200 },
  durian: 100
};
$("#ini").append(JSON.stringify(object1));    

$.extend( true, object1, object2 );
 
$("#ext").append(JSON.stringify(object1));
<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>

于 2015-06-08T17:17:04.680 回答
5

您可以使用以下{[key]: value}语法创建新对象:

const foo = {
  a: 'key',
  b: 'value'
}

const bar = {
  [foo.a]: foo.b
}

console.log(bar); // {key: 'value'}
console.log(bar.key); // value

const baz = {
  ['key2']: 'value2'
}

console.log(baz); // {key2: 'value2'}
console.log(baz.key2); // value2

使用前面的语法,您现在可以使用扩展语法{...foo, ...bar}来添加新对象,而不会改变旧值:

const foo = {a: 1, b: 2};

const bar = {...foo, ...{['c']: 3}};

console.log(bar); // {a: 1, b: 2, c: 3}
console.log(bar.c); // 3

于 2020-05-19T15:20:37.987 回答
4

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

第一种方法是使用点表示法:

obj.key3 = value3;

但是这样,您应该在点符号后使用IdentifierName 。

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

obj["key3"] = value3;

和另一种形式:

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

这样,您可以在括号表示法中使用表达式(包括IdentifierName )。

于 2013-08-02T03:51:40.443 回答
1

因为它是过去的问题,而是现在的问题。建议另一种解决方案:只需将键和值传递给函数,您将获得一个地图对象。

var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}
于 2018-02-16T11:10:08.880 回答
0

为了在对象前面添加键值对,以便for in与该元素一起使用,首先执行以下操作:

    var nwrow = {'newkey': 'value' };
    for(var column in row){
        nwrow[column] = row[column];
    }
    row = nwrow;
于 2016-12-08T22:24:04.557 回答
0

实现相同的最佳方法如下所述:

function getKey(key) {
  return `${key}`;
}

var obj = {key1: "value1", key2: "value2", [getKey('key3')]: "value3"};

//console.log(obj);
于 2017-11-21T04:19:41.380 回答