回答編集履歴

4

余計な処理を整理

2021/01/18 08:14

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -18,9 +18,7 @@
18
18
 
19
19
  return Object.entries(a).every(aei => {
20
20
 
21
- console.log(aei);
22
-
23
- // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
21
+ // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド。配列型も実行可能
24
22
 
25
23
  if (typeof b[aei[0]] == 'undefined') {
26
24
 
@@ -30,7 +28,7 @@
30
28
 
31
29
  } else {
32
30
 
33
- // オブジェクトの要素が両方配列の場合、再帰実行
31
+ // オブジェクトの要素が両方配列かオブジェクト、関数の場合、再帰実行
34
32
 
35
33
  if (
36
34
 

3

オブジェクトの入れ子などにも対応

2021/01/18 08:14

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -6,81 +6,73 @@
6
6
 
7
7
  function compare(a, b){
8
8
 
9
- // everyは、配列を走査し、コールバックによって、falseを返した時、走査を終了し、そのままfalseを返す配列メソッド
9
+ if (
10
10
 
11
- // 全ての走査が、trueだった場合はtrueを返す
11
+ a !== null &&
12
12
 
13
- return a.every((ae, ai) => {
13
+ b !== null &&
14
14
 
15
- // 両方配列だった場合は再帰実行
15
+ (typeof a == 'object' && typeof b == 'object')
16
16
 
17
- if (Array.isArray(ae) && Array.isArray(b[ai])) {
17
+ ) {
18
18
 
19
- return compare(ae, b[ai]);
19
+ return Object.entries(a).every(aei => {
20
20
 
21
- } else {
21
+ console.log(aei);
22
22
 
23
- // 配列でないがオブジェクトの時は、オブジェクト用の処理
23
+ // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
24
24
 
25
-
25
+ if (typeof b[aei[0]] == 'undefined') {
26
26
 
27
- if (
27
+ // bにそもそもキーが存在しなければ、違うのでfalseを返す
28
28
 
29
- ae !== null &&
29
+ return false;
30
30
 
31
- b[ai] !== null &&
31
+ } else {
32
32
 
33
- (typeof ae == 'object' && typeof b[ai] == 'object')
33
+ // オブジェクトの要素が両方配列の場合、再帰実行
34
34
 
35
- ) {
35
+ if (
36
36
 
37
- return Object.entries(ae).every(aei => {
37
+ aei[1] !== null &&
38
38
 
39
- // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
39
+ b[aei[0]] !== null &&
40
40
 
41
- if (typeof b[ai][aei[0]] == 'undefined') {
41
+ (
42
42
 
43
- // bにそもそもキーが存在しなければ、違うのでfalseを返す
43
+ (typeof aei[1] == 'object' && typeof b[aei[0]] == 'object') ||
44
44
 
45
- return false;
45
+ (typeof aei[1] == 'function' && typeof b[aei[0]] == 'function')
46
46
 
47
- } else {
47
+ )
48
48
 
49
- // オブジェクトの要素が両方配列の場合、再帰実行
49
+ ) {
50
50
 
51
- if (Array.isArray( aei[1] ) && Array.isArray( b[ai][aei[0]] ) ) {
51
+ // オブジェクトか関数なので再帰
52
52
 
53
- return compare(aei[1], b[ai][aei[0]]);
53
+ return compare( aei[1], b[aei[0]]);
54
54
 
55
- } else {
55
+ }
56
56
 
57
- // プリミティブ値の場合、そのまま比較
57
+ // プリミティブ値の場合、そのまま比較
58
58
 
59
- return aei[1] === b[ai][aei[0]];
59
+ return aei[1] === b[aei[0]];
60
60
 
61
- }
61
+ }
62
62
 
63
+ });
64
+
65
+ } else if (typeof a == 'function' && typeof b == 'function') {
66
+
67
+ // 両者が関数の場合は、単純に関数名を比較(細かくやるのはかなり複雑になる)
68
+
69
+ return a.name == b.name;
70
+
63
- }
71
+ }
64
72
 
65
73
 
66
74
 
67
- });
68
-
69
- } else if (typeof ae == 'function' && typeof b[ai] == 'function') {
70
-
71
- // 両者が関数の場合は、単純に関数名を比較(細かくやるのはかなり複雑になる)
72
-
73
- return ae.name == b[ai].name;
74
-
75
- }
76
-
77
- // ここまでくると、プリミティブ値同士なのでそのまま比較
78
-
79
- return ae === b[ai];
75
+ return a === b;
80
-
81
- }
82
-
83
- });
84
76
 
85
77
  }
86
78
 
@@ -133,3 +125,11 @@
133
125
  # 追記
134
126
 
135
127
  関数に関しては、もっと比較せねばならないものが激増するため、関数名が一致するかどうかの比較に留めています。
128
+
129
+
130
+
131
+ また、配列はそもそもオブジェクトのため、オブジェクトかどうかを比較し、
132
+
133
+ 再帰させるようにしました。
134
+
135
+ これにより、オブジェクトの入れ子などにも対応させています。

2

比較要素に関数が含まれる場合に対応

2021/01/18 08:12

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -22,15 +22,15 @@
22
22
 
23
23
  // 配列でないがオブジェクトの時は、オブジェクト用の処理
24
24
 
25
+
26
+
25
27
  if (
26
28
 
27
29
  ae !== null &&
28
30
 
29
31
  b[ai] !== null &&
30
32
 
31
- typeof ae == 'object' &&
33
+ (typeof ae == 'object' && typeof b[ai] == 'object')
32
-
33
- typeof b[ai] == 'object'
34
34
 
35
35
  ) {
36
36
 
@@ -65,6 +65,12 @@
65
65
 
66
66
 
67
67
  });
68
+
69
+ } else if (typeof ae == 'function' && typeof b[ai] == 'function') {
70
+
71
+ // 両者が関数の場合は、単純に関数名を比較(細かくやるのはかなり複雑になる)
72
+
73
+ return ae.name == b[ai].name;
68
74
 
69
75
  }
70
76
 
@@ -121,3 +127,9 @@
121
127
  `Map型`(厳密には型ではない)などには対応していませんのであしからず。
122
128
 
123
129
  (もっと処理複雑になります)
130
+
131
+
132
+
133
+ # 追記
134
+
135
+ 関数に関しては、もっと比較せねばならないものが激増するため、関数名が一致するかどうかの比較に留めています。

1

typeof nullのバグに対応した

2021/01/18 07:38

投稿

miyabi_pudding
miyabi_pudding

スコア9555

test CHANGED
@@ -22,7 +22,17 @@
22
22
 
23
23
  // 配列でないがオブジェクトの時は、オブジェクト用の処理
24
24
 
25
+ if (
26
+
27
+ ae !== null &&
28
+
29
+ b[ai] !== null &&
30
+
25
- if (typeof ae == 'object' && typeof b[ai] == 'object' ) {
31
+ typeof ae == 'object' &&
32
+
33
+ typeof b[ai] == 'object'
34
+
35
+ ) {
26
36
 
27
37
  return Object.entries(ae).every(aei => {
28
38
 
@@ -52,7 +62,7 @@
52
62
 
53
63
  }
54
64
 
55
-
65
+
56
66
 
57
67
  });
58
68