如何不可变更新对象数组属性?为何这段map代码无法运行?
问题解答
嘿,我来帮你理清这两个问题:
1. 如何不创建临时变量将a_1的值更新为2?
有两种实用的思路,都不需要额外创建临时变量:
直接修改原对象(因为数组里的元素是对象的引用,直接操作即可):
const d = [{ a_1: 1, b_2: 2 }]; d[0].a_1 = 2;这段代码直接访问数组第一个元素的
a_1属性并赋值,完全不需要临时变量。生成新对象/数组(不修改原数据):
如果你不想改动原对象,想返回一个新的数组,也可以直接用map配合对象展开语法,不需要临时变量存储中间结果:const d = [{ a_1: 1, b_2: 2 }]; // 直接覆盖原数组(如果业务允许的话) d = d.map(obj => ({ ...obj, ['a_1']: 2 })); // 或者直接使用map返回的新数组,无需临时变量
2. 为什么你的map代码无法运行?
问题出在对象字面量的语法错误上。先看你写的代码:
const myKey = 'a_1' const myValue = 2 d.map(obj => ({...obj, obj[myKey]:myValue}))
在JavaScript的对象字面量中,当你想用表达式作为属性名时,必须使用方括号包裹的语法。而你这里写的obj[myKey]是获取属性值的表达式,把它放在属性名的位置会导致语法解析失败——JavaScript无法识别这种写法作为属性名。
另外,你其实不需要obj[myKey],因为myKey已经是存储目标属性名的变量了,直接用[myKey]就能把变量的值作为属性名。
修正后的正确代码是:
const myKey = 'a_1' const myValue = 2 d.map(obj => ({...obj, [myKey]: myValue}))
这样方括号会把myKey的值(也就是'a_1')作为新的属性名,覆盖原对象的对应属性值,代码就能正常执行了。
内容的提问来源于stack exchange,提问作者user3106579
相关产品推荐
相关产品推荐

