1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- "use strict";
- var eq = require("./eq")
- , isPlainObject = require("./is-plain-object")
- , value = require("./valid-value");
- var isArray = Array.isArray
- , keys = Object.keys
- , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable
- , objHasOwnProperty = Object.prototype.hasOwnProperty
- , eqArr
- , eqVal
- , eqObj;
- eqArr = function (arr1, arr2, recMap) {
- var i, length = arr1.length;
- if (length !== arr2.length) return false;
- for (i = 0; i < length; ++i) {
- if (objHasOwnProperty.call(arr1, i) !== objHasOwnProperty.call(arr2, i)) return false;
- if (!eqVal(arr1[i], arr2[i], recMap)) return false;
- }
- return true;
- };
- eqObj = function (obj1, obj2, recMap) {
- var k1 = keys(obj1), k2 = keys(obj2);
- if (k1.length !== k2.length) return false;
- return k1.every(function (key) {
- if (!objPropertyIsEnumerable.call(obj2, key)) return false;
- return eqVal(obj1[key], obj2[key], recMap);
- });
- };
- eqVal = function (val1, val2, recMap) {
- var i, eqX, c1, c2;
- if (eq(val1, val2)) return true;
- if (isPlainObject(val1)) {
- if (!isPlainObject(val2)) return false;
- eqX = eqObj;
- } else if (isArray(val1) && isArray(val2)) {
- eqX = eqArr;
- } else {
- return false;
- }
- c1 = recMap[0];
- c2 = recMap[1];
- i = c1.indexOf(val1);
- if (i === -1) {
- i = c1.push(val1) - 1;
- c2[i] = [];
- } else if (c2[i].indexOf(val2) !== -1) return true;
- c2[i].push(val2);
- return eqX(val1, val2, recMap);
- };
- module.exports = function (val1, val2) {
- if (eq(value(val1), value(val2))) return true;
- return eqVal(Object(val1), Object(val2), [[], []]);
- };
|