如何深拷贝Note[]类型的data.notes?避免引用关联导致值同步变化
解决数组拷贝后随原数组变化的问题
这问题我之前也碰到过!核心原因是你只做了浅拷贝——数组本身是引用类型,哪怕你复制了数组的外层,里面的Note对象还是和原数组共享同一个引用,所以原数组里的Note内容一变,拷贝后的数组自然也跟着变。
根据你的Note结构,这里给你几个可行的解决方案:
1. 针对简单结构的Note(无嵌套对象)
如果你的Note对象里只有字符串、数字、布尔这类基本类型,没有嵌套的子对象,用map配合对象展开运算符就能创建完全独立的副本:
const detailsOfCurrentNotes = data.notes.map(note => ({ ...note }));
原理:map会遍历原数组的每个Note,{...note}会创建一个新的对象,把原note的所有属性复制进去,这样每个元素都是全新的对象,和原数组的Note不再共享引用。
2. 快速深拷贝(适合无特殊类型的场景)
如果Note里有嵌套对象,但没有函数、Symbol、undefined或者循环引用这类特殊内容,可以用JSON序列化再反序列化的方式:
const detailsOfCurrentNotes = JSON.parse(JSON.stringify(data.notes));
注意:这个方法虽然简单,但会忽略函数、Symbol类型的属性,也无法处理循环引用,使用前要确认你的Note结构没有这些情况。
3. 自定义递归深拷贝(处理复杂场景)
如果你的Note结构比较复杂,有嵌套对象甚至特殊类型,最好自己实现一个递归深拷贝函数,确保所有层级的对象都被复制:
function deepCopy(obj) { // 基本类型直接返回 if (obj === null || typeof obj !== 'object') return obj; // 数组的话递归复制每个元素 if (obj instanceof Array) { return obj.map(item => deepCopy(item)); } // 对象的话递归复制每个属性 const copiedObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { copiedObj[key] = deepCopy(obj[key]); } } return copiedObj; } // 使用方式 const detailsOfCurrentNotes = deepCopy(data.notes);
这个函数会逐层遍历数组和对象,把每个层级的元素都复制成新的独立对象,彻底切断和原数组的引用关联。
内容的提问来源于stack exchange,提问作者Sampath
相关产品推荐
相关产品推荐

