1 | var collectionCompare = compare;
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | function compare(value1, value2) {
|
18 | if (value1 === value2) {
|
19 | return true;
|
20 | }
|
21 |
|
22 |
|
23 | if (value1 !== value1 && value2 !== value2) {
|
24 | return true;
|
25 | }
|
26 | if ({}.toString.call(value1) != {}.toString.call(value2)) {
|
27 | return false;
|
28 | }
|
29 | if (value1 !== Object(value1)) {
|
30 |
|
31 | return false;
|
32 | }
|
33 | if (!value1) {
|
34 | return false;
|
35 | }
|
36 | if (Array.isArray(value1)) {
|
37 | return compareArrays(value1, value2);
|
38 | }
|
39 | if ({}.toString.call(value1) == '[object Set]') {
|
40 | return compareArrays(Array.from(value1), Array.from(value2));
|
41 | }
|
42 | if ({}.toString.call(value1) == '[object Object]') {
|
43 | return compareObjects(value1, value2);
|
44 | } else {
|
45 | return compareNativeSubtypes(value1, value2);
|
46 | }
|
47 | }
|
48 |
|
49 | function compareNativeSubtypes(value1, value2) {
|
50 |
|
51 | return value1.toString() === value2.toString();
|
52 | }
|
53 |
|
54 | function compareArrays(value1, value2) {
|
55 | var len = value1.length;
|
56 | if (len != value2.length) {
|
57 | return false;
|
58 | }
|
59 | var alike = true;
|
60 | for (var i = 0; i < len; i++) {
|
61 | if (!compare(value1[i], value2[i])) {
|
62 | alike = false;
|
63 | break;
|
64 | }
|
65 | }
|
66 | return alike;
|
67 | }
|
68 |
|
69 | function compareObjects(value1, value2) {
|
70 | var keys1 = Object.keys(value1).sort();
|
71 | var keys2 = Object.keys(value2).sort();
|
72 | var len = keys1.length;
|
73 | if (len != keys2.length) {
|
74 | return false;
|
75 | }
|
76 | for (var i = 0; i < len; i++) {
|
77 | var key1 = keys1[i];
|
78 | var key2 = keys2[i];
|
79 | if (!(key1 == key2 && compare(value1[key1], value2[key2]))) {
|
80 | return false;
|
81 | }
|
82 | }
|
83 | return true;
|
84 | }
|
85 |
|
86 | export {collectionCompare as default};
|