@antv/f2
Version:
Charts for mobile visualization.
71 lines • 1.72 kB
JavaScript
import _typeof from "@babel/runtime/helpers/esm/typeof";
import { isArray, isFunction, isPlainObject } from '@antv/util';
function objToString(obj) {
return Object.prototype.toString.call(obj);
}
function objectKeys(obj) {
return Object.keys(obj);
}
function equal(a, b) {
if (a === b) return true;
if (_typeof(a) !== _typeof(b)) {
return false;
}
// null 和 undefined
if (a == null || b == null) {
return false;
}
// 特殊处理NaN
if (Number.isNaN(a) && Number.isNaN(b)) {
return true;
}
if (objToString(a) !== objToString(b)) {
return false;
}
// 如果是function, 则认为是相对
if (isFunction(a)) {
return true;
}
// 值类型,Number String Boolean
if (_typeof(a) !== 'object') {
return false;
}
if (isArray(a)) {
if (a.length !== b.length) {
return false;
}
for (var i = a.length - 1; i >= 0; i--) {
if (!equal(a[i], b[i])) {
return false;
}
}
return true;
}
if (!isPlainObject(a)) {
return false;
}
var ka = objectKeys(a);
var kb = objectKeys(b);
// having the same number of owned properties (keys incorporates hasOwnProperty)
if (ka.length !== kb.length) {
return false;
}
// the same set of keys (although not necessarily the same order),
ka.sort();
kb.sort();
// ~~~cheap key test
for (var _i = ka.length - 1; _i >= 0; _i--) {
if (ka[_i] != kb[_i]) {
return false;
}
}
// equivalent values for every corresponding key, and ~~~possibly expensive deep test
for (var _i2 = ka.length - 1; _i2 >= 0; _i2--) {
var key = ka[_i2];
if (!equal(a[key], b[key])) {
return false;
}
}
return true;
}
export default equal;