You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.5 KiB
59 lines
1.5 KiB
"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), [[], []]); |
|
};
|
|
|