diginext-utils
Version:
README.md
54 lines • 1.67 kB
JavaScript
import { isObject } from "./isObject.js";
/**
* Performs a deep equality comparison between two values.
* Recursively compares objects and their nested properties.
*
* @template T - The type of values to compare
* @param valueA - First value to compare
* @param valueB - Second value to compare
* @returns True if values are deeply equal
*
* @example
* ```ts
* isEqual({ a: 1, b: 2 }, { a: 1, b: 2 }); // true
* isEqual({ a: 1, b: { c: 3 } }, { a: 1, b: { c: 3 } }); // true
* isEqual({ a: 1 }, { a: 2 }); // false
* isEqual([1, 2, 3], [1, 2, 3]); // true
* ```
*/
export function isEqual(valueA, valueB) {
// Handle primitive types and same reference
if (valueA === valueB) {
return true;
}
// Handle null and undefined
if (valueA == null || valueB == null) {
return valueA === valueB;
}
// Handle arrays
if (Array.isArray(valueA) && Array.isArray(valueB)) {
if (valueA.length !== valueB.length) {
return false;
}
return valueA.every((item, index) => isEqual(item, valueB[index]));
}
// Handle objects
if (isObject(valueA) && isObject(valueB)) {
const objA = valueA;
const objB = valueB;
const keysA = Object.keys(objA);
const keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
return keysA.every((key) => {
if (!(key in objB)) {
return false;
}
return isEqual(objA[key], objB[key]);
});
}
// Different types or primitives that aren't equal
return false;
}
//# sourceMappingURL=isEqual.js.map