回答編集履歴

4

テキスト修正

2020/09/13 15:38

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -51,4 +51,4 @@
51
51
  > id: 0,
52
52
  > …
53
53
 
54
- となっており、最終的な結果を得る変数 `tree` は配列になっており、これに合わせて、先に挙げた回答コードで得られる `tree` も配列になりますが、一般にツリー(木構造)というと、ルートのノードが一個と考えるのが通常と思われます。(ちなみに、グラフ理論の用語では、複数の木は、森(forest)と呼ばれます。) これをふまえて、もし、元の配列 `datas`の要素として、 `parent` が null である要素は一個しか出現しないことが前提になるのでしたら、最終的な結果が入る変数`tree` には、配列ではなくルートノードのオブジェクトが入ってくることにしたほうがよいかもしれません。または、元の配列 `datas`の要素として、 `parent` が null である要素が複数ある場合は、最終的な結果は配列になり、その要素それぞれが木のルートノードになるので、変数名を複数形の`trees` にするか、あるいは `forest` にしたほうがよいかもしれません。
54
+ となっており、最終的な結果を得る変数 `tree` は配列になっており、これに合わせて、[先に挙げた回答コード](https://codepen.io/jun68ykt/pen/poyVMMo?editors=0012)で得られる `tree` も配列になりますが、一般にツリー(木構造)というと、ルートのノードが一個と考えるのが通常と思われます。(ちなみに、グラフ理論の用語では、複数の木は、森(forest)と呼ばれます。) これをふまえて、もし、元の配列 `datas`の要素として、 `parent` が null である要素は一個しか出現しないことが前提になるのでしたら、最終的な結果が入る変数`tree` には、配列ではなくルートノードのオブジェクトが入ってくることにしたほうがよいかもしれません。または、元の配列 `datas`の要素として、 `parent` が null である要素が複数ある場合は、最終的な結果は配列になり、その要素それぞれが木のルートノードになるので、変数名を複数形の`trees` にするか、あるいは `forest` にしたほうがよいかもしれません。

3

テキスト修正

2020/09/13 15:38

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -41,4 +41,14 @@
41
41
  return null;
42
42
  }
43
43
  ```
44
- - **動作確認用 codepen:** [jun68ykt/pen/wvGXvXd?editors=0012](https://codepen.io/jun68ykt/pen/wvGXvXd?editors=0012)
44
+ - **動作確認用 codepen:** [jun68ykt/pen/wvGXvXd?editors=0012](https://codepen.io/jun68ykt/pen/wvGXvXd?editors=0012)
45
+
46
+ ### 追記2
47
+
48
+ 一点、細かい指摘にはなりますが、補足があります。ご質問では
49
+
50
+ > var tree = [{
51
+ > id: 0,
52
+ > …
53
+
54
+ となっており、最終的な結果を得る変数 `tree` は配列になっており、これに合わせて、先に挙げた回答コードで得られる `tree` も配列になりますが、一般にツリー(木構造)というと、ルートのノードが一個と考えるのが通常と思われます。(ちなみに、グラフ理論の用語では、複数の木は、森(forest)と呼ばれます。) これをふまえて、もし、元の配列 `datas`の要素として、 `parent` が null である要素は一個しか出現しないことが前提になるのでしたら、最終的な結果が入る変数`tree` には、配列ではなくルートノードのオブジェクトが入ってくることにしたほうがよいかもしれません。または、元の配列 `datas`の要素として、 `parent` が null である要素が複数ある場合は、最終的な結果は配列になり、その要素それぞれが木のルートノードになるので、変数名を複数形の`trees` にするか、あるいは `forest` にしたほうがよいかもしれません。

2

テキスト修正

2020/09/13 15:28

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -15,6 +15,8 @@
15
15
  }, [[], []]);
16
16
  ```
17
17
 
18
+ 上記では、 ツリーノードの`id`とノードオブジェクトとのマップを配列で実装しており、それが、reduce の各回で変数`map`に入ってきます。
19
+
18
20
  - **動作確認用 codepen:** [jun68ykt/pen/poyVMMo?editors=0012](https://codepen.io/jun68ykt/pen/poyVMMo?editors=0012)
19
21
 
20
22
 
@@ -22,7 +24,7 @@
22
24
 
23
25
  ### 追記
24
26
 
25
- 参考までに、再帰を使って、指定`id`のノードをツリーから探すコードを挙げます。(※再帰の深さが何らかの最大値を越えないようする処理は加えていません。)
27
+ 参考までに、再帰を使って、指定`id`のノードをツリーから深さ優先で探すコードを挙げます。(※再帰の深さが何らかの最大値を越えないようする処理は加えていません。)
26
28
 
27
29
  ```javascript
28
30
  const findTreeNodeById = (tree, id) => {

1

テキスト修正

2020/09/13 14:28

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -18,4 +18,25 @@
18
18
  - **動作確認用 codepen:** [jun68ykt/pen/poyVMMo?editors=0012](https://codepen.io/jun68ykt/pen/poyVMMo?editors=0012)
19
19
 
20
20
 
21
- 参考になれば幸いです。
21
+ 参考になれば幸いです。
22
+
23
+ ### 追記
24
+
25
+ 参考までに、再帰を使って、指定`id`のノードをツリーから探すコードを挙げます。(※再帰の深さが何らかの最大値を越えないようする処理は加えていません。)
26
+
27
+ ```javascript
28
+ const findTreeNodeById = (tree, id) => {
29
+ for (let i = 0; i < tree.length; ++ i) {
30
+ if (tree[i].id === id) {
31
+ return tree[i];
32
+ } else if (tree[i].children.length > 0) {
33
+ const node = findTreeNodeById(tree[i].children, id);
34
+ if (node) {
35
+ return node;
36
+ }
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ ```
42
+ - **動作確認用 codepen:** [jun68ykt/pen/wvGXvXd?editors=0012](https://codepen.io/jun68ykt/pen/wvGXvXd?editors=0012)