两个js对象深度比较

两个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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容