复习JS基础之JSON字符串的完全相等的实现

618 阅读1分钟

一. JSON字符串的完全相等的实现

思路

利用递归进行循环每一个对象属性

解决方法

  1. 先排除一下等情况:

1.1 两者完全相等,这种直接返回true

1.2 两者类型不同, 这种直接返回false

1.3 两者中其中一种是对象,包含两者都是对象, 所以这种直接直接利用===进行全等比较即可

1.4 两者中只有其中一方为数组,这种直接false

1.5 两者都为数组,其长度不相同,这种直接false

  1. 排序上面的一些情况后,剩下的就是为对象的情况,利用循环 + 递归其属性对象,将上面的为false的情况直接返回false,其余的情况就为true

实现

/**
 * @param {any} o1
 * @param {any} o2
 * @return {boolean}
 */
var areDeeplyEqual = function(o1, o2) {
    // 两者完全相等,就直接返回
    if (o1 === o2) return true;
    if (typeof o1 !== typeof o2) return false;
    // 两个中其中有一个值不为object类型,就直接比较
    if (!isObject(o1) || !isObject(o2)) return o1 === o2;
    // 其中一方为数组,另一方不为数组, 直接false
    if (Array.isArray(o1) !== Array.isArray(o2)) return false;
    // 两者都为数组,长度不等,直接false
    if (Array.isArray(o1) && Array.isArray(o2) && o1.length !== o2.length) return false;
    const k1 = getKeys(o1);
    const k2 = getKeys(o2);
    // 获取两者中的键,比较其长度
    if (k1.length !== k2.length) return false;
    // const len = k1.length;
    // for (let i = 0; i < k1.length; i++) {
    //     let k = k1[i];
    //     if (!areDeeplyEqual(o1[k], o2[k])) {
    //         return false;
    //     }
    // }
    let i = 0;
    while (i < k1.length) {
        let k = k1[i];
        if (!areDeeplyEqual(o1[k], o2[k])) {
            return false;
        }
        i ++;
    }
    // for (let k of k1) {
    //     if (!areDeeplyEqual(o1[k], o2[k])) {
    //         return false;
    //     }
    // }
    return true;
};

const hasReflect = 'Reflect' in globalThis;

function isObject(o) {
    return o !== null && typeof o === 'object';
}

function getKeys(obj) {
    return hasReflect ? Reflect.ownKeys(obj) : Object.keys(obj);
}