@grafana/faro-core
Version:
Core package of Faro.
59 lines • 1.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.deepEqual = deepEqual;
const is_1 = require("./is");
// This function was inspired by fast-deep-equal
// fast-deep-equal has issues with Rollup and also it checks for some edge cases that we don't need
function deepEqual(a, b) {
if (a === b) {
return true;
}
// Using isTypeOf instead of isNumber as isNumber also checks against NaN
if ((0, is_1.isTypeof)(a, 'number') && isNaN(a)) {
return (0, is_1.isTypeof)(b, 'number') && isNaN(b);
}
const aIsArray = (0, is_1.isArray)(a);
const bIsArray = (0, is_1.isArray)(b);
if (aIsArray !== bIsArray) {
return false;
}
if (aIsArray && bIsArray) {
const length = a.length;
if (length !== b.length) {
return false;
}
for (let idx = length; idx-- !== 0;) {
if (!deepEqual(a[idx], b[idx])) {
return false;
}
}
return true;
}
const aIsObject = (0, is_1.isObject)(a);
const bIsObject = (0, is_1.isObject)(b);
if (aIsObject !== bIsObject) {
return false;
}
if (a && b && aIsObject && bIsObject) {
const aKeys = Object.keys(a);
const bKeys = Object.keys(b);
const aLength = aKeys.length;
const bLength = bKeys.length;
if (aLength !== bLength) {
return false;
}
for (let aKey of aKeys) {
if (!bKeys.includes(aKey)) {
return false;
}
}
for (let aKey of aKeys) {
if (!deepEqual(a[aKey], b[aKey])) {
return false;
}
}
return true;
}
return false;
}
//# sourceMappingURL=deepEqual.js.map