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

回答編集履歴

3

追記

2020/09/13 11:55

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
File without changes

2

追記

2020/09/13 11:55

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -34,4 +34,19 @@
34
34
  }
35
35
  const tree = [result[0]];
36
36
  console.log(JSON.stringify(tree, undefined, 2));
37
+ ```
38
+
39
+ ### 追記 id が連番でない、またはルートが複数ある場合
40
+
41
+ ```JavaScript
42
+ const result = datas
43
+ .map(a => { return {"id":a.id, "children":[]}; })
44
+ .reduce((result, item) => { result[item.id] = item; return result; }, {});
45
+ for (const datum of datas.filter(a => a.parent !== null)) {
46
+ result[datum.parent].children.push(result[datum.id]);
47
+ }
48
+ const tree = datas
49
+ .filter(a => a.parent === null)
50
+ .map(a => result[a.id]);
51
+ console.log(JSON.stringify(tree, undefined, 2));
37
52
  ```

1

修正

2020/09/13 11:55

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -29,8 +29,9 @@
29
29
  ];
30
30
 
31
31
  const result = datas.map(a => { return {"id":a.id, "children":[]}; });
32
- for (let datum of datas.filter(a => a.parent !== null)) {
32
+ for (const datum of datas.filter(a => a.parent !== null)) {
33
33
  result[datum.parent].children.push(result[datum.id]);
34
34
  }
35
+ const tree = [result[0]];
35
- console.log(JSON.stringify([result[0]]));
36
+ console.log(JSON.stringify(tree, undefined, 2));
36
37
  ```