javascript - 是否有扩展运算符更改值的功能?
问题描述
let abc = [
{ name: "a" },
{ name: "b"}
];
const editName = (oldName, name, arr) =>
arr.map(item => {
if (item.name === oldName) {
return {
...item,
name
}
} else {
return item;
}
});
let updateName = editName("a", "c", abc)
console.log(updateName[0])
我目前正在学习通过“地图”来改变价值。但是,我不知道为什么值被“if”部分中的扩展操作替换
剂量扩散算子有那个功能吗?
...item
是name: "a"
,不是吗?
解决方案
传播有帮助:
- 简明扼要地创建一个具有 的所有属性的新对象
item
,外加一个name
属性 - 不改变原来的
item
如果您不使用 spread (或等价物),而是使用类似 的东西item.name = name;
,则原始数组中的对象将发生变异,这可能是不可取的:
// original code
let abc = [
{ name: "a" },
{ name: "b"}
];
const editName = (oldName, name, arr) =>
arr.map(item => {
if (item.name === oldName) {
return {
...item,
name
}
} else {
return item;
}
});
let updateName = editName("a", "c", abc)
console.log(updateName[0])
console.log(abc[0]);
// bad, mutation code without spread syntax
let abc = [
{ name: "a" },
{ name: "b"}
];
const editName = (oldName, name, arr) =>
arr.map(item => {
if (item.name === oldName) {
item.name = name;
}
return item;
});
let updateName = editName("a", "c", abc)
console.log(updateName[0])
console.log(abc[0]);
上面,错误的代码使对象发生了变异,正如您通过abc[0]
记录变异的名称而不是abc[0]
.
如果你的意思是为什么它不是
return {
item,
name
}
这是因为这会导致像这样的对象
{
item: {
name: 'a',
},
name: 'c'
}
有一个item
属性(这可能是不需要的)。Using...
将扩展对象的内容与对象字面量的其余部分结合起来。
推荐阅读
- c++ - 英特尔 TBB -“InitializeCriticalSectionEx”:找不到标识符编译器错误
- python - Python 3 中的 Pandas to_csv 到 GzipFile 不起作用
- java - 如何在 SonarQube(自定义规则)中获取变量的值?
- javascript - 无法在 chrome 中的 gmail 上运行脚本
- python - 我的字典计算字母而不是单词
- mysql - 账户之间的 MySQL 共同关注者
- macros - 用于保存和列出会话中所有宏的 SAS 宏
- javascript - Vue.js 标记为无效 HTML
- cakephp - CakePHP 3.5 重定向缺少控制器异常
- python - 父类中使用的模拟对象