回答編集履歴

15

テキスト修正

2018/09/24 12:06

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -202,7 +202,7 @@
202
202
 
203
203
 
204
204
 
205
- なるほどですね。おそらくこのコードは、
205
+ なるほどですね。おそらく [このコード](https://jsfiddle.net/psn5849w/97/) は、
206
206
 
207
207
 
208
208
 

14

テキスト修正

2018/09/24 12:06

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
  こんにちは。
82
82
 
83
- だいぶ時間が経ってしまいましたが、その後も機能追加などを行っているようですね。
83
+ だいぶ時間が経ってしまいましたが、その後も機能追加などの作業が続いていらっしゃご様子ですね。
84
84
 
85
85
 
86
86
 

13

テキスト修正

2018/09/24 12:03

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -224,11 +224,11 @@
224
224
 
225
225
 
226
226
 
227
- つまり、分かり易くいえば、もし仮に、私と貴殿が同じ職場で働く同僚であったならば、
227
+ __つまり、分かり易くいえば、もし仮に、私と貴殿が同じ職場で働く同僚であったならば、__
228
-
228
+
229
- 「ほらみろw だから、【パターン:あ】 は辞めとけっていったのに〜w」
229
+ __「ほらみろw だから、【パターン:あ】 は辞めとけっていったのに〜w」__
230
-
230
+
231
- と、(心の中で、そっと) disるだろうなあということですね。
231
+ __と、(心の中で、そっと) disるかもしれいなということですね。__
232
232
 
233
233
 
234
234
 

12

テキスト修正

2018/09/24 11:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -256,8 +256,24 @@
256
256
 
257
257
     
258
258
 
259
- - それと、今後も 【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると何かと大変そうなので、投稿ツリーをDOMとは別の場所に、**ツリーを保持したデータ構造によって、** 持っておくほうがよいのでは?と思います。
259
+ - それと、今後も 【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると何かと大変そうなので、投稿ツリーをDOMとは別の場所に、**ツリーを保持したデータ構造によって、** 持っておくほうがよいのでは?と(無責任な思いつきですが、)思ったりもします。
260
260
 
261
261
      
262
262
 
263
263
  - たとえば、でいうと、返信ふくめた投稿のツリー情報を XMLで返すAPIをバックエンドで用意しておき、フロントエンドでこれを呼んだレスポンスをパースした結果を親子関係のマスターデータとし、これに対して JQuery のセレクタを使って投稿の親子関係を取得して、画面HTMLのDOMに反映させる、みたいなことですね。
264
+
265
+
266
+
267
+ ---
268
+
269
+
270
+
271
+ **追伸3**
272
+
273
+
274
+
275
+ いずれにせよ、ここから先は、バックエンドの投稿テーブルの作り方だったり、サーバーサイドでどこまで画面がレンダリングされてきて、どこから先をフロントエンドでやるのか? みたいな詳細に突っ込まないと正確なコメントはできなさそうです。
276
+
277
+
278
+
279
+ 頑張ってください!

11

テキスト修正

2018/09/24 11:12

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -256,7 +256,7 @@
256
256
 
257
257
     
258
258
 
259
- - それと、今後も 【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると何かと大変そうなので、投稿ツリーをDOMとは別の場所に、ツリーを保持したデータ構造によって、持っておくほうがよいのでは?と思います。
259
+ - それと、今後も 【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると何かと大変そうなので、投稿ツリーをDOMとは別の場所に、**ツリーを保持したデータ構造によって、** 持っておくほうがよいのでは?と思います。
260
260
 
261
261
      
262
262
 

10

テキスト修正

2018/09/24 11:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -252,7 +252,7 @@
252
252
 
253
253
 
254
254
 
255
- - それでも、【パターン:い】でいくのであれば、ある投稿(post)が削除されたとしても、それは、バックエンドのデータベースの投稿テーブルでレコードを物理削除しないで論理削除するに留めておき、画面表示上は「この投稿は削除されました」とい表示される投稿として、親子関係のツリーからは消えないようにするのが、ひとつ手としてあるかなと思います。
255
+ - それでも、【パターン:い】でいくのであれば、ある投稿(post)が削除されたとしても、それは、バックエンドのデータベースの投稿テーブルでレコードを物理削除しないで論理削除するだけに留めておき、画面表示上は「この投稿は削除されました」といった感じで表示される投稿として、親子関係のツリーからは消えないようにするのが、ひとつ手としてあるかなと思います。
256
256
 
257
257
     
258
258
 

9

テキスト修正

2018/09/24 10:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
 
104
104
 
105
- を拝見して、どのようなロジックで動いているかもだいたい把握しました。その上で指摘させて頂きたい点は以下です。(1)と(2)は細かいツッコミですが、 (3)はこのままだと不具合が起こる点の指摘です。
105
+ を拝見して、どのようなロジックで動いているかもだいたい把握しました。その上で指摘させて頂きたい点は以下です。(1)と(2)は細かいツッコミですが、 (3)はこのままだと不具合が起こる気がする点です。
106
106
 
107
107
 
108
108
 

8

テキスト修正

2018/09/24 10:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -256,4 +256,8 @@
256
256
 
257
257
     
258
258
 
259
- - それと、【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると大変なので、投稿ツリーをDOMとは別の場所に、(ツリーを保持したデータ構造によって)持っておくほうがよいのでは?と思います。
259
+ - それと、今後も 【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると何かと大変そうなので、投稿ツリーをDOMとは別の場所に、(ツリーを保持したデータ構造によって)持っておくほうがよいのでは?と思います。
260
+
261
+     
262
+
263
+ - たとえば、でいうと、返信ふくめた投稿のツリー情報を XMLで返すAPIをバックエンドで用意しておき、フロントエンドでこれを呼んだレスポンスをパースした結果を親子関係のマスターデータとし、これに対して JQuery のセレクタを使って投稿の親子関係を取得して、画面HTMLのDOMに反映させる、みたいなことですね。

7

テキスト修正

2018/09/24 10:54

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -210,7 +210,7 @@
210
210
 
211
211
 
212
212
 
213
- とあったとおり、力作ではあるのでしょうから、なんとかしたいお気持ちも分かります。しかし、ある投稿(post)が削除される可能性があり、これに対応しようとするとエラーになってしまったという状況は、私からすると、回答に書いた、【パターン:あ】を使うことへの所感:
213
+ とあったとおり、力作ではあるのでしょうから、なんとかしたいお気持ちも分かります。しかし、ある投稿(post)が削除される可能性があり、これに対応しようとするとエラーになってしまったという状況は、私からすると、2018/09/01 01:22 コメントに書いた、【パターン:あ】を使うことへの所感:
214
214
 
215
215
 
216
216
 

6

テキスト修正

2018/09/24 10:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -232,7 +232,7 @@
232
232
 
233
233
 
234
234
 
235
- ツリーを構成する各ノードの親子関係の操作だとか、ノードの削除、移動などは、プログラミングの勉強にはなりますし、自分で書くとアルゴリズムの勉強になりますし楽しかったりもするのでハマる気持ちも分かりますが、これがもし何らかの製品として本番サーバーに載せるサービスの一部であるなら、こういうツリー操作はまさにDOM操作のお家芸ですから、先達のプログラマーの成果に乗っかった方が良い気がします。(つまり、【パターン:い】を採用するということですね。)
235
+ ツリーを構成する各ノードの親子関係の操作だとか、ノードの削除、移動など自分で書くとアルゴリズムの勉強になりますし楽しかったりもするのでハマる気持ちも分かりますが、これがもし何らかの製品として本番サーバーに載せるサービスの一部であるなら、こういうツリー操作はまさにDOM操作のお家芸ですから、先達のプログラマーの成果に乗っかった方が良い気がします。(つまり、投稿の親子関係をDOMの親子関係に乗せた【パターン:い】を採用するということですね。)
236
236
 
237
237
 
238
238
 

5

テキスト修正

2018/09/24 10:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -241,3 +241,19 @@
241
241
 
242
242
 
243
243
  とはいえ、明らかに大変なのに、【パターン:あ】に猪突猛進した貴殿の勢い、嫌いではありません。
244
+
245
+
246
+
247
+ ---
248
+
249
+
250
+
251
+ **追伸2**
252
+
253
+
254
+
255
+ - それでも、【パターン:い】でいくのであれば、ある投稿(post)が削除されたとしても、それは、バックエンドのデータベースの投稿テーブルでレコードを物理削除しないで論理削除するに留めておき、画面表示上は「この投稿は削除されました」という表示される投稿として、親子関係のツリーからは消えないようにするのが、ひとつ手としてあるかなと思います。
256
+
257
+    
258
+
259
+ - それと、【パターン:い】でいくにしても、ツリーの情報をHTML要素の `my_ancestor_num` などの属性に、ハイフン区切りの文字列で持たせると大変なので、投稿ツリーをDOMとは別の場所に、(ツリーを保持したデータ構造によって)持っておくほうがよいのでは?と思います。

4

テキスト修正

2018/09/24 10:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
 
112
112
 
113
- `<ul class="children">` の `childrens` は、末尾の s が不要なので削除し `children` とする。
113
+ `<ul class="childrens">` の `childrens` は、末尾の s が不要なので削除し `children` とする。
114
114
 
115
115
 
116
116
 

3

テキスト修正

2018/09/24 09:39

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -228,7 +228,7 @@
228
228
 
229
229
  「ほらみろw だから、【パターン:あ】 は辞めとけっていったのに〜w」
230
230
 
231
- と、ここぞばかりにdisるだろうなあということですね。
231
+ と、(心の中で、そっdisるだろうなあということですね。
232
232
 
233
233
 
234
234
 

2

テキスト修正

2018/09/24 09:30

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -69,3 +69,175 @@
69
69
 
70
70
 
71
71
  以上、参考になれば幸いです。
72
+
73
+
74
+
75
+ ---
76
+
77
+ **追伸**
78
+
79
+
80
+
81
+ こんにちは。
82
+
83
+ だいぶ時間が経ってしまいましたが、その後も機能追加などを行っているようですね。
84
+
85
+
86
+
87
+ さて、次の 1. と 2. について回答します。
88
+
89
+
90
+
91
+ 1. コードに対する指摘点
92
+
93
+ 2. getParentNums が再帰を使っていることで起こるエラーについて
94
+
95
+
96
+
97
+ ### 1. コードに対する指摘点
98
+
99
+
100
+
101
+ https://jsfiddle.net/psn5849w/97/
102
+
103
+
104
+
105
+ を拝見して、どのようなロジックで動いているかもだいたい把握しました。その上で指摘させて頂きたい点は以下です。(1)と(2)は細かいツッコミですが、 (3)はこのままだと不具合が起こる点の指摘です。
106
+
107
+
108
+
109
+ #### (1) childrens の末尾の s が不要
110
+
111
+
112
+
113
+ `<ul class="children">` の `childrens` は、末尾の s が不要なので削除し `children` とする。
114
+
115
+
116
+
117
+ #### (2) 配列.indexOf(x) >= 0 の替わりに、配列.includes(x) を使う
118
+
119
+
120
+
121
+ 配列に何か特定の要素が含まれるかの判定には、 indexOf ではなく、 [includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使う。
122
+
123
+
124
+
125
+  修正前:
126
+
127
+ ```javascript
128
+
129
+ if (parents.indexOf(my_post_num) >= 0){
130
+
131
+ ```
132
+
133
+  修正後:
134
+
135
+ ```javascript
136
+
137
+ if (parents.includes(my_post_num)){
138
+
139
+ ```
140
+
141
+
142
+
143
+ #### (3) 正規表現の修正
144
+
145
+
146
+
147
+ closeがクリックされたときの閉じる子要素の判定に使う正規表現の修正
148
+
149
+
150
+
151
+  修正前:
152
+
153
+ ```javascript
154
+
155
+ var child_ancestor_num = click_ancestor_num+'-'+click_post_num;
156
+
157
+ ```
158
+
159
+
160
+
161
+  修正後:
162
+
163
+ ```javascript
164
+
165
+ var child_ancestor_num_pattern = new RegExp(`^${click_ancestor_num}-${click_post_num}(-\d+)*$`);
166
+
167
+ ```
168
+
169
+
170
+
171
+      として、以下のようにチェックする。
172
+
173
+      
174
+
175
+ ```javascript
176
+
177
+ if (ancestor_num.match(child_ancestor_num_pattern)){
178
+
179
+ ```
180
+
181
+
182
+
183
+ 修正前だと、もし `child_ancestor_num` がたとえば `"0-111-222"` で、 `ancestor_num` が `"0-10-111-2229-76"`のとき、以下の判定
184
+
185
+
186
+
187
+ ```javascript
188
+
189
+ "0-10-111-2229-76".match("0-111-222");
190
+
191
+ ```
192
+
193
+ はマッチしてしまうので意図しない動作を引き起こす原因になります。修正後のように正規表現を作ることでこれを避けられます。
194
+
195
+
196
+
197
+ ### 2. getParentNums が再帰を使っていることで起こるエラーについて
198
+
199
+
200
+
201
+ > コメントが削除された場合、再帰になっているせいで「親が削除されて見つからない」→「too much recursionエラー!」になってしまうのです。
202
+
203
+
204
+
205
+ なるほどですね。おそらくこのコードは、
206
+
207
+
208
+
209
+ > 教えて頂いたり拾ったりしたコードを一晩中切って貼ってを繰り返した
210
+
211
+
212
+
213
+ とあったとおり、力作ではあるのでしょうから、なんとかしたいお気持ちも分かります。しかし、ある投稿(post)が削除される可能性があり、これに対応しようとするとエラーになってしまったという状況は、私からすると、元の回答に書いた、【パターン:あ】を使うことへの所感:
214
+
215
+
216
+
217
+ > ・・・・・ 直感として思うのは、
218
+
219
+ > 「慎重に書かないとバグのあるコードを書いてしまいそう」
220
+
221
+
222
+
223
+ に当てはまる事態であったりします。
224
+
225
+
226
+
227
+ つまり、分かり易くいえば、もし仮に、私と貴殿が同じ職場で働く同僚であったならば、
228
+
229
+ 「ほらみろw だから、【パターン:あ】 は辞めとけっていったのに〜w」
230
+
231
+ と、ここぞとばかりにdisるだろうなあということですね。
232
+
233
+
234
+
235
+ ツリーを構成する各ノードの親子関係の操作だとか、ノードの削除、移動などは、プログラミングの勉強にはなりますし、自分で書くとアルゴリズムの勉強になりますし楽しかったりもするのでハマる気持ちも分かりますが、これがもし何らかの製品として本番サーバーに載せるサービスの一部であるなら、こういうツリー操作はまさにDOM操作のお家芸ですから、先達のプログラマーの成果に乗っかった方が良い気がします。(つまり、【パターン:い】を採用するということですね。)
236
+
237
+
238
+
239
+ さらにより賢明なのは、ツリーの基礎となるグラフ理論の初歩をかじったり、ツリーのノードを一番上から下へ、あるいは、末端のノードから上へ再帰でたどるコードを自分で書いたり、他の人のコードを読んだりして、「やろうと思えば自分で書ける」と思えるだけのプログラミング力はキープしつつ、明らかに先達の作ったコードに乗っかった方がよいときは思いっきり乗っかって楽をして、自分はもっと別の重要なコードを書く方に時間をあてる、みたいな姿勢かなと思います。
240
+
241
+
242
+
243
+ とはいえ、明らかに大変なのに、【パターン:あ】に猪突猛進した貴殿の勢い、嫌いではありません。

1

テキスト修正

2018/09/24 09:22

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 以下のように修正すると、いかがでしょうか?
5
+ 以下のように`if`条件を修正すると、いかがでしょうか?
6
6
 
7
7
 
8
8