js算法之深度拷贝和深度比较
Posted fanzhanxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js算法之深度拷贝和深度比较相关的知识,希望对你有一定的参考价值。
深度拷贝
代码如下:
function clone(obj) { if(obj == null || typeof obj !== ‘object‘) return obj // new obj.constructor() 这里表示返回obj对应的构造函数,如果obj是一个数组则返回一个空数组,如果obj是一个对象则返回一个空对象 // const newObj = new obj.constructor() let newObj = null // 时间对象有特殊性 if(obj.constructor === Date) { newObj = new obj.constructor(obj) }else{ newObj= obj.constructor() } // Object.getOwnPropertyDescriptors(obj) 保证obj里面的成员不在原型链上面 for(let key in Object.getOwnPropertyDescriptors(obj)) { // clone这个方法返回的是if(obj == null || typeof obj !== ‘object‘) return obj这行代码 newObj[key] = clone(obj[key]) } // 下面这行代码是最后执行的,因为一个方法在return之后这个方法就不会执行了 return newObj } let obj = {1:1,2:2,3:3,4:{a:12}} console.log(clone(obj))//->{ ‘1‘: 1, ‘2‘: 2, ‘3‘: 3, ‘4‘: { a: 12 } }
深度比较
代码如下所示:
function deepCompare(a,b) { // typeof null也是object,所以这里需要将null和object联合起来判断 if(a === null || typeof a !== ‘object‘ || b === null || typeof b!== ‘object‘) { return a === b } const propsA = Object.getOwnPropertyDescriptors(a) const propsB = Object.getOwnPropertyDescriptors(b) if(Object.keys(propsA).length !== Object.keys(propsB).length) { return false } // 数组every函数的用法是数组的每一项都满足every里面的条件 return Object.keys(propsA).every( // deepCompare(a[key],b[key])这里进行递归的比较,分别比较a和b的每一项 // 相当于又执行到了if(a === null || typeof a !== ‘object‘ || b === null || typeof b!== ‘object‘) {return a === b} // 这行代码 key => deepCompare(a[key],b[key]) ) } // console.log(Object.keys({a:1,b:3})) //->[ ‘a‘, ‘b‘ ] // console.log(deepCompare({a:1,b:3},{a:1,b:3})) //->true // console.log(deepCompare({a:1,b:3},{a:1,b:4})) //->false
以上是关于js算法之深度拷贝和深度比较的主要内容,如果未能解决你的问题,请参考以下文章