2021-10-28

常用克隆数据方式


通常需要克隆数据的原因是因为:当你操作一个数据时,在 dom上不希望看到数据的改变,而是希望 通过接口保存或者某些操作以后,再更新数据的变化,更多是用在编辑数据的时候

展开操作符号 …

扩展符 相当于是解构当前数据

用于克隆数组
const arr = [1,2,3]
const arr2 = [...arr], // [1,2,3]

用于克隆对象
const obj = {
	name: '张三',
	age: '18'
}
const obj2 = {...obj},// { name:'张三', age: '18'}
想要复制的同时,增加一个值,只需要在后面直接添加即可,
例如增加一个性别属性
const obj3 = {...obj,sex: '男'} // { name:'张三', age: '18',sex: '男'}}

注意:
(1)不管是复制数组还是对象,必须外层包裹一个表示数组或对象的运算符去接收结构出来的值
(2)展开符 复制对象时,只进行一层深拷贝,如果对象中的某个值是引用类型的话,对这个对象只进行浅拷贝,这就导致数据双向绑定时,改变拷贝对象的引用类型的值,原对象中的值也会跟着改变。
比如:
let obj = {
	arr: [1,2,3],
	age: 16,
	sex: '男'
}
let obj2 = {...obj}
obj2.arr[0] = 4
console.log(obj1)
console.log(obj2)

2021-10-28

克隆对象

let obj = {
	name: '张三',
	age: '18'
}
let obj2 = {}
(1)传统克隆方式,适用于 对象中没有引用类型的对象
for(let key in obj) {
	obj2[key] = obj[key]
}
(2)参考 展开操作符

克隆数组

(1)封装一个 克隆函数
function cloneArray(arr){
    let newArr=[];
    for(let i=0;i<arr.length;i++) {
        newArr.push(arr[i]);
    }
    return newArr;
}
let arr = ['aaa','bbb','ccc','wwwww','ddd']
let arr2 = cloneArray(arr)
console.log(arr)  // ["aaa", "bbb", "ccc", "wwwww", "ddd"]
console.log(arr2)  // ["aaa", "bbb", "ccc", "wwwww", "ddd"]
console.log( arr2 === arr )   //false
(2) 扩展符 参考展开操作符

(3) 数组 concat() 操作,concat 还能追加项 
const arr = [1,2,3]
const arr2 = arr.concat()
const arr3 = arr.concat(4)
console.log(arr)  // [1,2,3]
console.log(arr2)  // [1,2,3]
console.log( arr2 === arr )   //false
console.log(arr3)  // [1,2,3,4]

(4) 数组 slice(strat,end) 方法 不传参,也可以用来克隆数组
const arr = [1, 2, 3]
const arr2 = arr.slice()
console.log(arr)  // [1,2,3]
console.log(arr2)  // [1,2,3]
console.log(arr2 === arr)   //false

(5) Object.assign(item, item1) 方法用于对象的合并 item 目标对象 item1 被复制的对象
let arr = [1, 2, 3, 4]
let arr2 = []
Object.assign(arr2, arr)

深度克隆数组/对象 结合

直接传入对象/数组 返回克隆后的对象/数组
改方法通过递归的形式,将引用类型进行深度克隆,就不会出现像 展开符 传统的 for in 克隆时出现引用类型 无法深度克隆的情况
function deepClone(data) {
    let d;
    if (typeof data === "object") {
        if (data == null) {
            d = null;
        } else {
            if (data.constructor === Array) {
                d = [];
                for (let i in data) {
                    d.push(deepClone(data[i]));
                }
            } else {
                d = {};
                for (let i in data) {
                    d[i] = deepClone(data[i]);
                }
            }
        }
    } else {
        d = data;
    }
    return d;
}
上一篇:机器学习算法22 (06 决策树算法实列:决策树分类鸢尾花数据集 )


下一篇:【ubuntu 18.04】安装RVM