javascript - 为什么当我处理新列表时父列表对象的属性会更新
问题描述
我有两个清单:
parentList = [{ name: "Item1", flag: true }, { name: "Item2", flag: true }, { name: "Item3", flag: true }];
childList = [];
我正在将单击的项目从 parentList 推送到 childList 数组中,
哪个工作正常,但是当我从 childList 中删除一个项目并且如果我更改 parentList 的属性时:
在 parentList 列表上单击:
this.childList.push(item);
在 childList 上删除单击:
var index = this.childList.indexOf(item);
this.childList.splice(index, 1)
item.flag = false;
该项目已从子列表中删除,但是当我控制 parentList 的值时,它会给我false
一个标志键。
无法理解为什么它会改变财产的价值parentList
?
解决方案
当您在子列表中推送项目时,您插入的是同一个对象。当你这样做时:
var object1 = new Object();
var object2 = object1;
您不是将对象复制到另一个变量中,而是复制它的引用,这是一种用于在计算机内存中定位对象的地址。因此,因为它们具有相同的引用,所以这两个变量会将您引导到内存中的同一个对象。
当您从列表中取出一个对象并将其推送到另一个列表中时,也会发生同样的情况。您正在获取参考,然后将参考放在另一个列表中。
所以你需要传递两个完全不同的对象。您可以使用以下方法创建要传递的对象的副本:
let newObj = Object.assign({}, yourObj)
,基本上就是把'youObj'的所有属性都复制到新对象'{}'中,然后返回这个新对象。但这仅在属性未嵌套时才有效!let newObj = JSON.parse(JSON.stringify(yourObj))
,创建对象的 JSON 字符串,然后使用相同的字符串将对象重新创建为新对象(JSON 是表示 Javascript 对象的字符串格式)。
推荐阅读
- powershell - 通过 #Requires -Module 加载模块时,无法通过 $MyInvocation 检索启动脚本的路径或名称
- ajax - Vue.js 绑定 ajax 加载的 v-on 点击处理程序
- c# - 在 ASP.NET 中重命名程序集后,VS 2017 无法识别程序集名称
- ios - Swift 4,删除单元格时背景颜色变白
- .net - .NET 应用程序 (WinForms) 取决于 ASP.NET Core 服务器
- bash - 将来自另一个 VM 的值文件存储为 Bash 中的变量
- reactjs - 将接口对象作为道具传递,而不显式指定每个属性值
- python-3.x - 使用 BeautifulSoup 和/或 Selenium 导航 html 树
- bash - Unix 命令 Timeout 是否也会杀死该进程的任何子进程?
- javascript - 更新到网格后获取编辑的行单元格值。网格