如何在 JavaScript 中深拷贝数组
在 JavaScript 中复制对象时,可以创建 深拷贝或浅拷贝 。深拷贝的好处是它复制嵌套的对象,所以你可以修改克隆的数组而不影响原始数组。 这样的库 唯一的问题是您要么需要像Lodash ,要么需要结合使用 JSON.stringify()
和 JSON.parse()
。
Lodash
Lodash 的 cloneDeep(value)
函数将为您深度复制数组。
const objects = [{ 'a': 1 }, { 'b': 2 }];
const deep = _.cloneDeep(objects);
deep[0] === objects[0]; // returns false
deep[0].a = 2;
objects[0].a; // 1, didn't change
Lodash 的 cloneDeep()
在处理边缘情况方面做得很好,比如克隆日期:
const objects = [{ createdAt: new Date('2017-06-01') }];
const deep = _.cloneDeep(objects);
deep[0].createdAt === objects[0].createdAt; // false
deep[0].createdAt instanceof Date; // true
objects[0].createdAt instanceof Date; // true
JSON.stringify() 和 JSON.parse()
这种功能组合确实可以完成工作,但并不完美。
const obj = { name: { first: 'Jean-Luc', last: 'Picard' } };
const copy = JSON.parse(JSON.stringify(obj));
copy.name.first = 'Johnny';
obj.name.first; // Jean-Luc
注意: 此方法仅适用于包含以下 JavaScript 原语的 对象:
- 数字
- 字符串
- 布尔值
- 对象
- 数组
如果您要复制的对象包含 date
,例如,它可能会在以后导致一些问题:
const obj = { date: new Date() };
const copy = JSON.parse(JSON.stringify(obj));
obj.date instanceof Date; // true
copy.date.instanceof Date; // false, date is now a string
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论