ascor
Version:
一些常用的简单的js工具
66 lines (65 loc) • 2.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isDeepEqual = void 0;
var isObject_1 = require("./isObject");
var isArray_1 = require("./isArray");
var isNumber_1 = require("./isNumber");
var isTypeEqual_1 = require("./isTypeEqual");
/**
* 判断两个值是否相等,如果是嵌套对象则递归检查,暂不支持函数判断,如果对象存在函数方法,则会返回false
* @param a
* @param b
* @return Boolean 返回布尔值
*/
exports.isDeepEqual = function (a, b) {
// 不同类型返回false
if (!isTypeEqual_1.isTypeEqual(a, b)) {
return false;
}
//全等于返回true
if (a === b) {
return true;
}
//对于NaN===NaN => false ,我们要让他变为true,当他是相等的
if (isNaN(a) && isNaN(b) && isNumber_1.isNumber(a) && isNumber_1.isNumber(b)) {
return true;
}
//对象类型判断
if (isObject_1.isObject(a) && isObject_1.isObject(b)) {
if (Object.keys(a).length !== Object.keys(b).length) {
return false;
}
for (var key in a) {
if (a.hasOwnProperty(key)) {
if (!exports.isDeepEqual(a[key], b[key])) {
return false;
}
}
}
return true;
}
//数组类型判断,不按顺序,深度递归检测
if (isArray_1.isArray(a) && isArray_1.isArray(b)) {
if (a.length !== b.length) {
return false;
}
var tmp = [];
for (var i = 0; i < a.length; i++) {
var f = false;
for (var j = 0; j < b.length; j++) {
if (!tmp.includes(j)) {
if (exports.isDeepEqual(a[i], b[j])) {
f = true;
tmp.push(j);
break;
}
}
}
if (!f) {
return false;
}
}
return tmp.length === b.length;
}
return false;
};