回答編集履歴

1

おまけを追加

2018/01/16 06:31

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,4 +1,4 @@
1
- ンプルコードをリファクタリングしてみました。
1
+ 質問文存在する項目をシンプルリファクタリングしました。
2
2
 
3
3
 
4
4
 
@@ -36,11 +36,19 @@
36
36
 
37
37
  // 名前である必要がないので配列にしてList系のメソッドで一気に処理
38
38
 
39
- ['#hoge1', '#hoge2', '#hoge3']
39
+ [
40
40
 
41
- .map(function(it){return $(it)})
41
+ '#hoge1 .topContMenu li a',
42
42
 
43
+ '#hoge2 nav ul li a',
44
+
45
+ '#hoge3 .block'
46
+
47
+ ]
48
+
49
+ .map(function(it){return $(it)})
50
+
43
- .forEach(matchHeight);
51
+ .forEach(matchHeight);
44
52
 
45
53
  });
46
54
 
@@ -48,8 +56,76 @@
48
56
 
49
57
 
50
58
 
51
- 別の回答者のコメント欄でyambejpさんが突っ込んでますが、
59
+ ---
52
60
 
53
- HTMLは同一HTML内で同じID値は重複してはならないという鉄の掟があります。
54
61
 
62
+
63
+ 【追記】
64
+
65
+ turbgraphics200さんのコードゴルフのコードでインスピレーションが沸いたので、
66
+
67
+ 最低限の可読性を維持しつつ簡素なコードに作り変えます。
68
+
69
+
70
+
71
+ ```JavaScript
72
+
73
+ $(document).ready(function() {
74
+
75
+ [
76
+
77
+ '#hoge1 .topContMenu li a',
78
+
79
+ '#hoge2 nav ul li a',
80
+
81
+ '#hoge3 .block'
82
+
83
+ ]
84
+
85
+ .map(function(it){return $(it)})
86
+
87
+ .forEach(function($elements){
88
+
89
+ var heights = $elements.map(function(){return $(this).height()}).get();
90
+
91
+ var heighestHeight = Math.max.apply(null, heights);
92
+
93
+ $elements.height(heighestHeight);
94
+
95
+ });
96
+
97
+ });
98
+
99
+ ```
100
+
101
+
102
+
103
+ ポイントは$.mapです。
104
+
105
+ [【jQuery】複数の要素・配列に対して処理をするmapの使い方](http://www.task-notes.com/entry/20141019/1413717129)
106
+
107
+
108
+
109
+ eachとmapは同じコールバック関数を引数に持ち、同じように配列の中身に関数を適用していくものですが、
110
+
111
+ 一般的に下記のように使い分けられます。
112
+
113
+
114
+
115
+ - eachやforEach: 処理をしてこい、戻り値は不要だ
116
+
117
+ - map: 関数を適用した戻り値をもってこい、戻り値を元に新しい配列を作り直す
118
+
119
+
120
+
121
+ 基本的にはmapの方が戻り値を持って帰ってくる為上位互換とも言えますが、
122
+
55
- 基本的にIDは使わずClassを使うように検討してみてください
123
+ eachやforEach戻り値を使わない宣言として使えます
124
+
125
+ この辺を意識して使い分けるとぐっと読みやすくなるでしょう。
126
+
127
+
128
+
129
+ Math.maxは可変引数なのでそのままでは使えません。
130
+
131
+ しかし、[apply をビルトイン関数と共に利用する](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)を利用することで配列を使ってダイレクトに関数に適用できます。