javascript - 克隆后更改原始对象
问题描述
我想克隆一个对象然后更改它,但是当我这样做时,原始对象也会更改:
let items = result.Project.ItemGroup[1].Build;
let newItem = { ...items[0] };
newItem.$.Include = `test`;
在我对newItem
对象进行分配后,items[0]
值也发生了变化。
解决方案
传播只做一个浅拷贝。您没有更改您复制的内容,您正在更改其$
属性上的对象,而您没有复制该对象。items[0].$
并且newItem.$
都指的是同一个对象:
const items = [
{
$: {
Include: "test"
}
}
];
let newItem = {...items[0]};
console.log(items[0].$ === newItem.$); // true
您还需要这样的东西来克隆对象$
:
let newItem = {...items[0], $: {...items[0].$}};
const items = [
{
$: {
Include: "test"
}
}
];
let newItem = {...items[0], $: {...items[0].$}};
console.log(items[0].$ === newItem.$); // false
newItem.$.Include = "updated";
console.log(items[0].$.Include); // "test"
console.log(newItem.$.Include); // "updated"
(或一般的深度克隆功能。)
推荐阅读
- zsh - 如何在没有任何自定义的情况下运行 zsh?
- android - 避免工具栏被 NavigationDrawer 覆盖
- docker - 如何在 docker (v18.09) 中检查 default-ipc-mode
- c# - 在任何访问(foreach 等)上自动对 List<> 中的元素执行特定操作
- r - 将列名粘贴到 R 中数据框的每个值,但仅在一列中
- reactjs - 在同一个父级中动态渲染不同的子级?
- c++ - 可以返回右值引用吗?
- excel - 引用字母部分在另一个单元格中的列
- excel - 在服务器上运行 VBA 脚本时路径中有额外空间
- cassandra - Cassandra CQL - 在时间戳之前获取自 1 以来的记录