回答編集履歴

4

jQueryでn番目の要素にアクセスする方法を見つけた

2018/12/11 04:15

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -110,6 +110,30 @@
110
110
 
111
111
 
112
112
 
113
+ > `var dt_height = $('.child', this).outerHeight();`
114
+
115
+
116
+
117
+ 【追記】合計値が足される問題が片付いても動かないバグみっけた
118
+
119
+ `for (i = 0; i < length; i++)`の形式でループさせてるけど、
120
+
121
+ その変数`i`はどこにも使われていない。
122
+
123
+
124
+
125
+ 複数要素該当する場合、outerHeightは最初の要素の縦幅を返すそうだよ。
126
+
127
+ [リファレンスのouterHeight](http://api.jquery.com/outerheight/)の第一行目にバッチリと`for the first element`と記載されている。
128
+
129
+
130
+
131
+ jQueryだと`$('.child', this).eq(i)`みたいな感じでi番目のchildを取り出す事を明示しないとダメ。
132
+
133
+ [リファレンスのeq](https://api.jquery.com/eq/#eq-index)に英語だけど使い方が載ってるよ。
134
+
135
+
136
+
113
137
  ---
114
138
 
115
139
 

3

確認方法も追記

2018/12/11 04:14

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -17,6 +17,58 @@
17
17
 
18
18
 
19
19
  ではコードを読んでいきます。
20
+
21
+
22
+
23
+ > 配列がtableごとでリセットされず意図しないheightになってしまいます。
24
+
25
+
26
+
27
+ 本当?これ確認した?
28
+
29
+ こうすればarrayの中身がデベロッパーツール(F12キー)のconsoleで表示されるから確認してみて。
30
+
31
+
32
+
33
+ ```JavaScript
34
+
35
+ $(function () {
36
+
37
+ $('.parent').each(function () {
38
+
39
+ var array = [];
40
+
41
+ for (var i = 0; i < $('.child', this).length; i++) {
42
+
43
+ var dt_height = $('.child', this).outerHeight();
44
+
45
+ array.push(dt_height);
46
+
47
+ var maxH = Math.max.apply(null, array);
48
+
49
+ $('.child').css({
50
+
51
+ "height": maxH + "px"
52
+
53
+ });
54
+
55
+
56
+
57
+ // arrayの中身を確かめる為にconsole上に表示する
58
+
59
+ console.log(array);
60
+
61
+ }
62
+
63
+ });
64
+
65
+ });
66
+
67
+ ```
68
+
69
+
70
+
71
+ 私の机上デバッグだと正しく初期化されて、要素数1、2、3を繰り返すだけに見えるからね。
20
72
 
21
73
 
22
74
 

2

校正

2018/12/11 01:43

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,6 +1,6 @@
1
1
  配列の初期化は`var array = []`や`array.length = 0;`で正しく行えます。
2
2
 
3
- 代入を伴う方法は参照が剥がれてしまうので、引数等で持ってきた元の配列に副作用を与えたいニッチな要件では`array.length = 0;`を使う事がありますが、ネタとして知っておくと良いかも知れませんが、基本的にあんまりよろしい方法ではなく使わないで済むなら使わないほうが良いでょう
3
+ 代入を伴う方法は参照が剥がれてしまうので、引数等で持ってきた元の配列に副作用を与えたいニッチな要件では`array.length = 0;`を使う事がありますが、基本的にあんまりよろしい方法ではなく使わないで済むにこたことはありません
4
4
 
5
5
 
6
6
 
@@ -13,6 +13,10 @@
13
13
 
14
14
 
15
15
  ---
16
+
17
+
18
+
19
+ ではコードを読んでいきます。
16
20
 
17
21
 
18
22
 
@@ -30,6 +34,16 @@
30
34
 
31
35
  は?なんで急に書き方が変わるの?
32
36
 
37
+ each使えばthisが上書きされるから困ったんだと思うけど、
38
+
39
+ childの中身は普通に考えればchild内で全て解決出来るはずだから、改めて`$(this)`すれば大抵は事足りるはずだよ。
40
+
41
+
42
+
43
+ ループというのは小さい範囲で描いたほうがなにかと作りやすく不具合も出にくい。
44
+
45
+ 外に出せるものは外に出そう!
46
+
33
47
 
34
48
 
35
49
  > `$('.child').css({`
@@ -39,6 +53,8 @@
39
53
  いや、今まで第二引数にthis入れて`$('.child', this)`にしてたよね?
40
54
 
41
55
  なんで急にthis削ったの?
56
+
57
+ 今回の不具合はここが一番怪しい、修正すれば動くと思うよ。
42
58
 
43
59
 
44
60
 
@@ -52,17 +68,11 @@
52
68
 
53
69
 
54
70
 
55
- 例えばループ内でやるべきこととループ後べき事の区別がついてないこが挙げらます。
71
+ 挙げるとば、
56
72
 
57
- 配列から最大サイズを出す箇所`var maxH = Math.max.apply(null, array);`や、
73
+ Math.maxを通った結果は配列の最大値にきまっているので変数名にするまでもありません。
58
74
 
59
- その後の高さを設定する箇所はループ内で毎回やることではありませんよね。
60
-
61
-
62
-
63
- また、Math.maxを通った結果は配列の最大値にきまっているので変数名にするまでもありません。
64
-
65
- 最後に、jQueryのeachメソッドは戻り値を捨てるので配列を予め宣言する必要がありますが、
75
+ また、jQueryのeachメソッドは戻り値を捨てるので配列を予め宣言する必要がありますが、
66
76
 
67
77
  jQueryの[map](http://js.studio-kingdom.com/jquery/traversing/map)を使えば宣言と配列生成を同時に行えそうですね。
68
78
 

1

総評を追加

2018/12/11 01:38

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,3 +1,21 @@
1
+ 配列の初期化は`var array = []`や`array.length = 0;`で正しく行えます。
2
+
3
+ 代入を伴う方法は参照が剥がれてしまうので、引数等で持ってきた元の配列に副作用を与えたいニッチな要件では`array.length = 0;`を使う事がありますが、ネタとして知っておくと良いかも知れませんが、基本的にあんまりよろしい方法ではなく使わないで済むなら使わないほうが良いでしょう。
4
+
5
+
6
+
7
+ 今回は配列の初期化が原因ではないようです。
8
+
9
+ こういった勘違いで明後日の方向を向いてしまい大ハマリしてしまう事は私もよくやるので、
10
+
11
+ 今回の質問はかなりベストなタイミングだったと思います。
12
+
13
+
14
+
15
+ ---
16
+
17
+
18
+
1
19
  > `$('.parent').each(function () {`
2
20
 
3
21