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

回答編集履歴

1

someで書き直し

2018/12/18 03:12

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -12,23 +12,16 @@
12
12
 
13
13
  アロー関数は`{}`で始まる場合は明示的に`return value`しないと何も返さないので、この書き方だと常に空配列になるはずなのでケアレスミスを直しましょう。
14
14
 
15
- letを普段遣いしていますが**IE11非対応のサイト**と考えて良いのでしょうか?
16
- もしくはBabelかなにかES6以降のコードをES5変換する用意などは出来ていすか?
15
+ ※find→some全体的書き直しした。
17
16
 
18
- であればfilterよりfindを利用したほうが良いでしょう。
17
+ filterより[some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some)を利用したほうが良いでしょう。
19
18
  filterの場合は空、もしくは値の複数入った配列が取得できます。
20
19
  つまりfor文で配列の中身を全て精査するような動作になります。
21
20
 
22
- findの場合は1件該当する値を見つけたら、そこで捜索を打ち切ります。
21
+ someの場合は1件該当する値を見つけたら、そこで捜索を打ち切ります。
23
22
  つまり、for文のifで一致する値を見つけたらすぐに`break;`構文でループから抜ける処理に似た挙動になります。
24
23
 
25
24
  ```JavaScript
26
- // オブジェクトは空であっても必ずtrueとして判定される
27
- console.log(Boolean({})); // true
28
-
29
- // findで見つからなければundefinedになる
30
- console.log([].find(_ => false)); // undefined
31
-
32
25
  // 変数名は何がしたいかでちゃんと名付けた方が良いのと、letは後から変更したいケース以外では使わないように
33
26
  // JSでの配列の表現はこうした方が無難、コロンはキーの後にスペース無し
34
27
  const aryData = [
@@ -40,12 +33,20 @@
40
33
  const id_1 = "31";
41
34
  const id_2 = "32";
42
35
 
43
- // 「重複データ」が無ければ処理なので、duplicatedDataという変数名にした
36
+ // 「重複データ」が無ければ処理なので、hasDuplicatedDataという変数名にした
44
- const duplicatedData = aryData.find(data =>
37
+ const hasDuplicatedData = aryData.some(data =>
45
38
  (data.id_1 == id_1 && data.id_2 == id_2) ||
46
39
  (data.id_1 == id_2 && data.id_2 == id_1)
47
40
  );
48
- if (!duplicatedData) {
41
+ if (!hasDuplicatedData) {
49
42
  console.log("処理");
50
43
  }
44
+
45
+ // someでスッキリ書けるから、関数化したほうが良さそう
46
+ const isDuplicatedData = data =>
47
+ (data.id_1 == id_1 && data.id_2 == id_2) ||
48
+ (data.id_1 == id_2 && data.id_2 == id_1);
49
+ if (!aryData.some(isDuplicatedData)) {
50
+ console.log("処理")l
51
+ }
51
52
  ```