@technobuddha/library
Version:
A large library of useful functions
32 lines (31 loc) • 1.11 kB
JavaScript
function sameValue(x, y) {
if (x === y)
return x !== 0 || 1 / x === 1 / y;
// eslint-disable-next-line no-self-compare
return x !== x && y !== y;
}
/**
* Compare two object for equality. Testing goes one level deep.
*
* @param objA First object to compare
* @param objB Second object to compare
* @param exclude Array of key names to exclude from the comparison
* @returns true if the two objects have the same members
*/
export function shallowEquals(objA, objB, exclude = []) {
if (sameValue(objA, objB))
return true;
if (objA === null || objA === undefined || objB === null || objB === undefined)
return false;
const hash = new Set(exclude);
const keysA = Object.keys(objA).filter(key => !hash.has(key));
const keysB = Object.keys(objB).filter(key => !hash.has(key));
if (keysA.length !== keysB.length)
return false;
for (const key of keysA) {
if (!Object.prototype.hasOwnProperty.call(objB, key) || !sameValue(objA[key], objB[key]))
return false;
}
return true;
}
export default shallowEquals;