Blame view

node_modules/es5-ext/object/is-copy-deep.js 1.54 KB
aaac7fed   liuqimichale   add
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), [[], []]);
  };