UNPKG

@darwish/utils-core

Version:

87 lines (86 loc) 2.63 kB
/* 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; }