heyujie
2021-06-07 8f8155aa4c83f7c2577ac123add550766b6a7ce3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
"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), [[], []]);
};