Blame view

node_modules/es5-ext/object/is-copy-deep.js 1.34 KB
f7563de62   Palak Handa   first commit
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
  'use strict';
  
  var eq            = require('./eq')
    , isPlainObject = require('./is-plain-object')
    , value         = require('./valid-value')
  
    , isArray = Array.isArray, keys = Object.keys
    , propertyIsEnumerable = Object.prototype.propertyIsEnumerable
  
    , eqArr, eqVal, eqObj;
  
  eqArr = function (a, b, recMap) {
  	var i, l = a.length;
  	if (l !== b.length) return false;
  	for (i = 0; i < l; ++i) {
  		if (a.hasOwnProperty(i) !== b.hasOwnProperty(i)) return false;
  		if (!eqVal(a[i], b[i], recMap)) return false;
  	}
  	return true;
  };
  
  eqObj = function (a, b, recMap) {
  	var k1 = keys(a), k2 = keys(b);
  	if (k1.length !== k2.length) return false;
  	return k1.every(function (key) {
  		if (!propertyIsEnumerable.call(b, key)) return false;
  		return eqVal(a[key], b[key], recMap);
  	});
  };
  
  eqVal = function (a, b, recMap) {
  	var i, eqX, c1, c2;
  	if (eq(a, b)) return true;
  	if (isPlainObject(a)) {
  		if (!isPlainObject(b)) return false;
  		eqX = eqObj;
  	} else if (isArray(a) && isArray(b)) {
  		eqX = eqArr;
  	} else {
  		return false;
  	}
  	c1 = recMap[0];
  	c2 = recMap[1];
  	i = c1.indexOf(a);
  	if (i !== -1) {
  		if (c2[i].indexOf(b) !== -1) return true;
  	} else {
  		i = c1.push(a) - 1;
  		c2[i] = [];
  	}
  	c2[i].push(b);
  	return eqX(a, b, recMap);
  };
  
  module.exports = function (a, b) {
  	if (eq(value(a), value(b))) return true;
  	return eqVal(Object(a), Object(b), [[], []]);
  };