reach-et-deep_equals
Version:
To deep compare objects
52 lines (41 loc) • 1.08 kB
JavaScript
/* eslint-disable no-use-before-define */
import { isObject } from 'reach-et-utilities/dist/checks';
function deepEqual(value1, value2) {
if (Array.isArray(value1) && Array.isArray(value2)) {
return arrayDeepEqual(value1, value2);
}
if (isObject(value1) && isObject(value2)) {
return objectDeepEqual(value1, value2);
}
return value1 === value2;
}
function objectDeepEqual(object1, object2) {
const keys1 = Object.keys(object1);
const keys2 = Object.keys(object2);
if (keys1.length !== keys2.length) {
return false;
}
for (const key of keys1) {
const val1 = object1[key];
const val2 = object2[key];
if (!deepEqual(val1, val2)) {
return false;
}
}
return true;
}
function arrayDeepEqual(array1, array2) {
if (array1.length !== array2.length) {
return false;
}
for (let i = 0; i < array1.length; i += 1) {
const val1 = array1[i];
const val2 = array2[i];
if (!deepEqual(val1, val2)) {
return false;
}
}
return true;
}
export default deepEqual;
/* eslint-enable no-use-before-define */