如何向 JavaScript 对象添加键/值对?

IT技术 javascript object-literal
2021-02-01 01:08:57

这是我的对象文字:

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

我如何添加字段key3value3对象?

6个回答

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

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

数组构造函数符号:

var arr = new Array();
@凯尔哈拉夫 Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
2021-03-14 01:08:57
@JohnSmithlength未设置属性,因为它不是数组,而是对象/地图/字典。
2021-03-14 01:08:57
@axelfreudiger 确实,任何在语法上不是有效变量标识符的东西都必须与括号表示法一起使用。
2021-03-17 01:08:57
如果键是一个数字怎么办?obj.123 = 456 不起作用。obj[123] = 456 确实有效
2021-03-31 01:08:57
obj 是一个对象。大括号之间(包括)的部分是对象字面量。obj 不是对象字面量。
2021-04-05 01:08:57

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

哎呀...我得意忘形了。走私来自未来的信息是非法的。适当遮掩!

一个真正的程序员会重视一些乐趣,以缓解压力大的职业。你的Year 2019 answer ... Opps ...部分值得感谢,你让我开心最佳答案+1
2021-03-11 01:08:57
obj+= 听起来很棒
2021-03-18 01:08:57
phpstorm 建议使用constandlet而不是var,那应该是 2018 年的方式吗?
2021-03-27 01:08:57
我们在 2020 年,这是否意味着赋值运算符已经可以用来替代扩展运算符?
2021-04-02 01:08:57
大声笑..我只是在我结束这里之前自发地使用了这个(当然没有用)
2021-04-05 01:08:57

我越来越喜欢了的LoDash /下划线写较大的项目时。

添加obj['key']obj.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}

_.默认值

第二个对象包含默认值,如果它们不存在,将添加到基础对象中。 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"}

Object.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}
我相信 _.merge 现在是 _.extend(destination, others)
2021-03-10 01:08:57
啊,你说得对,这_.extend是一个更通用的别名,因为下划线库仍在使用extendnot merge我会更新我的答案。
2021-04-03 01:08:57

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

arr[ 'key3' ] = value3;

或者

arr.key3 = value3;

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

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

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

也可以简单地覆盖他们正在创建的数组的长度属性。设置 var myarray["length"] = numArrayFields 为我解决了这个问题。假设您正在以某种方式跟踪添加到数组中的字段数。
2021-03-15 01:08:57
这不是数组而是对象。JS 数组仅按整数索引。尝试执行 arr.length 它将返回 0。有关此内容的更多阅读:less-broken.com/blog/2010/12/...
2021-03-16 01:08:57
@DevAntoine 的链接无法访问。如果你想得到这个数组类型的“长度”,使用:Object.keys(your_array).length 更多关于这个问题的阅读,请参见: stackoverflow.com/questions/21356880/array-length-returns-0
2021-03-29 01:08:57

表现

今天 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)

结论

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

在此处输入图片说明

细节

在下面的代码段中,有预先测试的解决方案,您可以在这里在您的机器上进行测试

在此处输入图片说明