@darwish/utils-core
Version:
87 lines (86 loc) • 2.63 kB
JavaScript
/* eslint-disable @typescript-eslint/no-use-before-define */
import { isArray, isDate, isMap, isNull, isNumber, isSet, } from '@darwish/utils-is';
import { typeOfData } from '@darwish/utils-tools';
export function deepEqualByArray(lfs, rfs, isSort) {
if (isSort === void 0) { isSort = false; }
if (lfs.length !== rfs.length) {
return false;
}
if (isSort) {
lfs.sort();
rfs.sort();
}
for (var i = 0; i < lfs.length; i++) {
if (!deepEqual(lfs[i], rfs[i])) {
return false;
}
}
return true;
}
export function deepEqualByObject(lfs, rfs) {
var key1 = Object.keys(lfs);
var value1 = Object.values(lfs);
var key2 = Object.keys(rfs);
var value2 = Object.values(rfs);
if (key1.length !== key2.length || value1.length !== value2.length) {
return false;
}
key1.sort();
key2.sort();
value1.sort();
value2.sort();
for (var i = 0; i < key1.length; i++) {
if (!deepEqual(key1[i], key2[i])) {
return false;
}
if (!deepEqual(value1[i], value2[i])) {
return false;
}
}
return true;
}
export default function deepEqual(lfs, rfs) {
if (typeOfData(lfs) !== typeOfData(rfs))
return false;
var isEqual = lfs === rfs;
if (typeof lfs === 'object' && typeof rfs === 'object') {
if (isArray(lfs) && isArray(rfs)) {
// array
isEqual = deepEqualByArray(lfs, rfs);
}
else if ((isSet(lfs) && isSet(rfs)) || (isMap(lfs) && isMap(rfs))) {
// set
var arrLfs = Array.from(lfs);
var arrRfs = Array.from(rfs);
isEqual = deepEqualByArray(arrLfs, arrRfs, true);
}
else if (isDate(lfs) && isDate(rfs)) {
// date
isEqual = lfs.getTime() === rfs.getTime();
}
else if (isNull(lfs) && isNull(rfs)) {
// null
isEqual = true;
}
else {
console.log(typeOfData(lfs), typeOfData(rfs));
isEqual = deepEqualByObject(lfs, rfs);
}
}
else if (typeof lfs === 'function' && typeof rfs === 'function') {
// function
isEqual = lfs.toString() === rfs.toString();
}
else if (typeof lfs === 'symbol' && typeof rfs === 'symbol') {
// symbol
isEqual = lfs.toString() === rfs.toString();
}
else {
// others
// number && NaN
if (isNumber(lfs) && isNumber(rfs) && isNaN(lfs) && isNaN(rfs))
return true;
isEqual = lfs === rfs;
}
return isEqual;
}