@hyper-fetch/react
Version:
React hooks and utils for the hyper-fetch
70 lines (56 loc) • 2.32 kB
text/typescript
/**
* Check if value is empty
* @param value any object or primitive
* @returns true when value is empty
*/
export const isEmpty = (value: unknown): boolean => {
const valueType = Object.prototype.toString.call(value);
if (Array.isArray(value)) return !value.length;
if (typeof value === "object" && value !== null && valueType === "[object Object]") return !Object.keys(value).length;
return false;
};
/**
* Allow to deep compare any passed values
* @param firstValue unknown
* @param secondValue unknown
* @returns true when elements are equal
*/
export const isEqual = (firstValue: unknown, secondValue: unknown): boolean => {
// Nulls (objects), and other primitives
if (firstValue === secondValue) return true;
try {
const firstValueType = Object.prototype.toString.call(firstValue);
const secondValueType = Object.prototype.toString.call(secondValue);
const firstType = typeof firstValue;
const secondType = typeof secondValue;
const isType = (type: unknown) => firstType === type && secondType === type;
const isTypeValue = (type: unknown) => firstValueType === type && secondValueType === type;
// Compared types are different
if (firstValueType !== secondValueType) return false;
// NaN
if (isType("number") && Number.isNaN(firstValue) && Number.isNaN(secondValue)) return true;
// Empty Array or Object
if (isEmpty(firstValue) && isEmpty(secondValue)) return true;
// Array
if (Array.isArray(firstValue) && Array.isArray(secondValue)) {
if (firstValue.length !== secondValue.length) return false;
return !firstValue.some((element, i) => !isEqual(element, secondValue[i]));
}
// Object
if (isType("object") && isTypeValue("[object Object]")) {
if (Object.keys(firstValue as object).length !== Object.keys(secondValue as object).length) return false;
return !Object.entries(firstValue as object).some(
([key, value]) => !isEqual(value, (secondValue as Record<string, unknown>)[key]),
);
}
// Date
if (firstValue instanceof Date && secondValue instanceof Date) {
return +firstValue === +secondValue;
}
// undefined, string, number, bool
return firstValue === secondValue;
} catch (err) {
console.error(err);
return false;
}
};