两个JS Object对象深度比较
开发中我们经常需要对两个对象值进行比较,百度一番问题多多,于是自己写了一个仅供参考。
const deepEqual = function (x, y) {
let prototype_x = Object.prototype.toString.call(x)
let prototype_y = Object.prototype.toString.call(y)
if(prototype_x == '[object Undefined]'){
prototype_x = '[object Null]'
}
if(prototype_y == '[object Undefined]'){
prototype_y = '[object Null]'
}
if (prototype_x != prototype_y) {
return false
}
/**以下类型相同比较 */
if (prototype_x == '[object Object]') {
if (Object.keys(x).length != Object.keys(y).length) {
return false;
}
for (var key in x) {
if (!deepEqual(x[key], y[key])) {
return false
}
}
} else if (prototype_x == '[object Array]') {
if (x.length != y.length) {
return false
}
for (let index = 0; index < x.length; index++) {
if (!deepEqual(x[index], y[index])) {
return false
}
}
}
/**过滤对函数的深比较 */
else if(prototype_x == '[object Function]'){
return true
} else {
/**其它类型值比较 */
return x == y
}
return true
}
定义一个深拷贝函数 接收目标target参数
function deepClone(target) {
// 定义一个变量
let result;
// 如果当前需要深拷贝的是一个对象的话
if (typeof target === 'object') {
// 如果是一个数组的话
if (Array.isArray(target)) {
result = []; // 将result赋值为一个数组,并且执行遍历
for (let i in target) {
// 递归克隆数组中的每一项
result.push(deepClone(target[i]))
}
// 判断如果当前的值是null的话;直接赋值为null
} else if(target===null) {
result = null;
// 判断如果当前的值是一个RegExp对象的话,直接赋值
} else if(target.constructor===RegExp){
result = target;
}else {
// 否则是普通对象,直接for in循环,递归赋值对象的所有值
result = {};
for (let i in target) {
result[i] = deepClone(target[i]);
}
}
// 如果不是对象的话,就是基本数据类型,那么直接赋值
} else {
result = target;
}
// 返回最终结果
return result;
}