teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

余計な処理を整理

2021/01/18 08:14

投稿

miyabi_pudding
miyabi_pudding

スコア9570

answer CHANGED
@@ -8,13 +8,12 @@
8
8
  (typeof a == 'object' && typeof b == 'object')
9
9
  ) {
10
10
  return Object.entries(a).every(aei => {
11
- console.log(aei);
12
- // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
11
+ // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド。配列型も実行可能
13
12
  if (typeof b[aei[0]] == 'undefined') {
14
13
  // bにそもそもキーが存在しなければ、違うのでfalseを返す
15
14
  return false;
16
15
  } else {
17
- // オブジェクトの要素が両方配列の場合、再帰実行
16
+ // オブジェクトの要素が両方配列かオブジェクト、関数の場合、再帰実行
18
17
  if (
19
18
  aei[1] !== null &&
20
19
  b[aei[0]] !== null &&

3

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

2021/01/18 08:14

投稿

miyabi_pudding
miyabi_pudding

スコア9570

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

2

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

2021/01/18 08:12

投稿

miyabi_pudding
miyabi_pudding

スコア9570

answer CHANGED
@@ -10,11 +10,11 @@
10
10
  return compare(ae, b[ai]);
11
11
  } else {
12
12
  // 配列でないがオブジェクトの時は、オブジェクト用の処理
13
+
13
14
  if (
14
15
  ae !== null &&
15
16
  b[ai] !== null &&
16
- typeof ae == 'object' &&
17
+ (typeof ae == 'object' && typeof b[ai] == 'object')
17
- typeof b[ai] == 'object'
18
18
  ) {
19
19
  return Object.entries(ae).every(aei => {
20
20
  // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
@@ -32,6 +32,9 @@
32
32
  }
33
33
 
34
34
  });
35
+ } else if (typeof ae == 'function' && typeof b[ai] == 'function') {
36
+ // 両者が関数の場合は、単純に関数名を比較(細かくやるのはかなり複雑になる)
37
+ return ae.name == b[ai].name;
35
38
  }
36
39
  // ここまでくると、プリミティブ値同士なのでそのまま比較
37
40
  return ae === b[ai];
@@ -59,4 +62,7 @@
59
62
 
60
63
  一応オブジェクト型には対応してますが、
61
64
  `Map型`(厳密には型ではない)などには対応していませんのであしからず。
62
- (もっと処理複雑になります)
65
+ (もっと処理複雑になります)
66
+
67
+ # 追記
68
+ 関数に関しては、もっと比較せねばならないものが激増するため、関数名が一致するかどうかの比較に留めています。

1

typeof nullのバグに対応した

2021/01/18 07:38

投稿

miyabi_pudding
miyabi_pudding

スコア9570

answer CHANGED
@@ -10,7 +10,12 @@
10
10
  return compare(ae, b[ai]);
11
11
  } else {
12
12
  // 配列でないがオブジェクトの時は、オブジェクト用の処理
13
+ if (
14
+ ae !== null &&
15
+ b[ai] !== null &&
13
- if (typeof ae == 'object' && typeof b[ai] == 'object' ) {
16
+ typeof ae == 'object' &&
17
+ typeof b[ai] == 'object'
18
+ ) {
14
19
  return Object.entries(ae).every(aei => {
15
20
  // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
16
21
  if (typeof b[ai][aei[0]] == 'undefined') {
@@ -25,7 +30,7 @@
25
30
  return aei[1] === b[ai][aei[0]];
26
31
  }
27
32
  }
28
-
33
+
29
34
  });
30
35
  }
31
36
  // ここまでくると、プリミティブ値同士なのでそのまま比較