一. JSON字符串的完全相等的实现
思路
利用递归进行循环每一个对象属性
解决方法
- 先排除一下等情况:
1.1 两者完全相等,这种直接返回
true1.2 两者类型不同, 这种直接返回
false1.3 两者中其中一种是对象,包含两者都是对象, 所以这种直接直接利用
===进行全等比较即可1.4 两者中只有其中一方为数组,这种直接
false1.5 两者都为数组,其长度不相同,这种直接
false
- 排序上面的一些情况后,剩下的就是为对象的情况,利用循环 + 递归其属性对象,将上面的为
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);
}