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

回答編集履歴

1

おまけを追加

2018/01/16 06:31

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -1,4 +1,4 @@
1
- ンプルコードをリファクタリングしてみました。
1
+ 質問文存在する項目をシンプルリファクタリングしました。
2
2
 
3
3
  ```JavaScript
4
4
  $(document).ready(function() {
@@ -17,12 +17,50 @@
17
17
  }
18
18
 
19
19
  // 名前である必要がないので配列にしてList系のメソッドで一気に処理
20
+ [
20
- ['#hoge1', '#hoge2', '#hoge3']
21
+ '#hoge1 .topContMenu li a',
22
+ '#hoge2 nav ul li a',
23
+ '#hoge3 .block'
24
+ ]
21
- .map(function(it){return $(it)})
25
+ .map(function(it){return $(it)})
22
- .forEach(matchHeight);
26
+ .forEach(matchHeight);
23
27
  });
24
28
  ```
25
29
 
30
+ ---
31
+
32
+ 【追記】
33
+ turbgraphics200さんのコードゴルフのコードでインスピレーションが沸いたので、
34
+ 最低限の可読性を維持しつつ簡素なコードに作り変えます。
35
+
36
+ ```JavaScript
37
+ $(document).ready(function() {
38
+ [
39
+ '#hoge1 .topContMenu li a',
40
+ '#hoge2 nav ul li a',
41
+ '#hoge3 .block'
42
+ ]
43
+ .map(function(it){return $(it)})
44
+ .forEach(function($elements){
45
+ var heights = $elements.map(function(){return $(this).height()}).get();
46
+ var heighestHeight = Math.max.apply(null, heights);
47
+ $elements.height(heighestHeight);
48
+ });
49
+ });
50
+ ```
51
+
52
+ ポイントは$.mapです。
53
+ [【jQuery】複数の要素・配列に対して処理をするmapの使い方](http://www.task-notes.com/entry/20141019/1413717129)
54
+
55
+ eachとmapは同じコールバック関数を引数に持ち、同じように配列の中身に関数を適用していくものですが、
56
+ 一般的に下記のように使い分けられます。
57
+
58
+ - eachやforEach: 処理をしてこい、戻り値は不要だ
59
+ - map: 関数を適用した戻り値をもってこい、戻り値を元に新しい配列を作り直す
60
+
26
- 回答者のコメント欄でyambejpさん込んでますが、
61
+ 基本的にはmap戻り値を持て帰ってくる為上位互換とも言えますが、
27
- HTMLは同一HTML内で同じID値は重複してはならないという鉄の掟があります。
28
- 基本的にID使わずClassを使うように検討してみてください
62
+ eachやforEach戻り値を使わない宣言として使えます
63
+ この辺を意識して使い分けるとぐっと読みやすくなるでしょう。
64
+
65
+ Math.maxは可変引数なのでそのままでは使えません。
66
+ しかし、[apply をビルトイン関数と共に利用する](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)を利用することで配列を使ってダイレクトに関数に適用できます。