@coreui/vue-pro
Version:
UI Components Library for Vue.js
75 lines (73 loc) • 2.41 kB
JavaScript
const isEqual = (a, b) => {
if (a === b)
return true;
// Handle cases where either a or b is null or not an object
if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {
// Handle NaN case
return a !== a && b !== b;
}
// Different constructors mean objects are not equal
if (a.constructor !== b.constructor)
return false;
// Handle Arrays
if (Array.isArray(a) && Array.isArray(b)) {
if (a.length !== b.length)
return false;
for (const [i, element] of a.entries()) {
const element2 = typeof b[i] === 'object' ? { ...b[i] } : b[i];
if (!isEqual(element, element2))
return false;
}
return true;
}
// Handle Maps
if (a instanceof Map && b instanceof Map) {
if (a.size !== b.size)
return false;
for (const [key, value] of a) {
if (!b.has(key) || !isEqual(value, b.get(key)))
return false;
}
return true;
}
// Handle Sets
if (a instanceof Set && b instanceof Set) {
if (a.size !== b.size)
return false;
for (const value of a) {
if (!b.has(value))
return false;
}
return true;
}
// Handle RegExp
if (a instanceof RegExp && b instanceof RegExp) {
return a.source === b.source && a.flags === b.flags;
}
// Handle objects with custom valueOf or toString
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (a.valueOf !== Object.prototype.valueOf && a.valueOf() !== b.valueOf())
return false;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (a.toString !== Object.prototype.toString && a.toString() !== b.toString())
return false;
// Compare object keys
const aKeys = Object.keys(a);
const bKeys = Object.keys(b);
if (aKeys.length !== bKeys.length)
return false;
// Ensure all keys in a are present in b
for (const key of aKeys) {
if (!Object.prototype.hasOwnProperty.call(b, key))
return false;
}
// Deep compare each property
for (const key of aKeys) {
if (!isEqual(a[key], b[key])) {
return false;
}
}
return true;
};
export { isEqual as default };
//# sourceMappingURL=isEqual.js.map