回答編集履歴

1

追記

2022/10/03 12:27

投稿

退会済みユーザー
test CHANGED
@@ -13,3 +13,96 @@
13
13
  **実行例:**
14
14
 
15
15
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-03/129510d0-533b-4da1-a473-881fa47fdad1.png)
16
+
17
+
18
+ ### 追記
19
+
20
+ > 参考にしているページ
21
+
22
+ に掲載されている `flattenObj` 関数を使うと実現できません、というわけではないのですが、
23
+ > 参考にしているページ
24
+ そのままだと一点問題があるので、それについて補足します。
25
+
26
+ その前にまず質問にある
27
+
28
+ >「ReferenceError: flattenObj is not defined(行 16」と表示され、処理が止まってしまいます。
29
+
30
+ というエラーになる原因は参考にしているページから`flattenObj` 関数をコピペし忘れているとかそういうことではないでしょうか?
31
+ さて正しく拝借(コピペ)して `flattenObj` 関数を使えるようになって
32
+
33
+ ```javascript
34
+ const flatJson = json.data.map((e) => flattenObj(e));
35
+ ```
36
+ の行でのエラーが解消されると `flatJson` は以下のような配列になります。
37
+
38
+ ```
39
+ [
40
+ {
41
+ project_id: 1,
42
+ project_name: 'XXX',
43
+ 'custom.0.def_id': 10,
44
+ 'custom.0.def_value': 'XXXXXX'
45
+ },
46
+ {
47
+ project_id: 2,
48
+ project_name: 'ZZZ',
49
+ 'custom.0.def_id': 20,
50
+ 'custom.0.def_value': 'ZZZZZZ'
51
+ }
52
+ ]
53
+ ````
54
+ 上記のように、配列 custom の先頭要素だったオブジェクトが展開されて、キーが `custom.0.def_id` と `custom.0.def_value` という(ちょっとややこしい)文字列になります。
55
+
56
+ その後、質問にあるコードでは
57
+ ```javascript
58
+ // 1つ目の配列のkeyをヘッダーとして定義
59
+ const headers = Object.data(flatJson[0]);
60
+ ```
61
+ とありますがこれは参考にされているページにもあるように、Object.data は間違いで正しくは Object.**keys** ですね。
62
+ ```javascript
63
+ const headers = Object.keys(flatJson[0]);
64
+ ```
65
+ で、その次に
66
+ ```javascript
67
+ // headers をループして生成した配列を body 配列にまとめる
68
+ const body = flatJson.map((row) => {
69
+ return headers.map((key) => row[key] || "");
70
+ });
71
+ ```
72
+ としているのですが、ここでひとつ問題があります。先のとおり
73
+ ```javascript
74
+ const headers = Object.keys(flatJson[0]);
75
+ ```
76
+ として `headers` を作っていますが、オブジェクトのキーには順序がありません(あるいは「オブジェクトのキーに順序があることを期待したコードは危うい」です。)ので、`headers` は期待している
77
+ ```
78
+ [ 'project_id', 'project_name', 'custom.0.def_id', 'custom.0.def_value' ]
79
+ ```
80
+ という並び順にはなって**いない可能性**があるものと考えなければなりません。もしこの順には並んでいないとすると
81
+
82
+ ```javascript
83
+ // headers をループして生成した配列を body 配列にまとめる
84
+ const body = flatJson.map((row) => {
85
+ return headers.map((key) => row[key] || "");
86
+ });
87
+ ```
88
+ によって得られる body の各行もまた headers の並び順でデータが並ぶことになるので、質問に
89
+
90
+ > こうしたい、、、
91
+
92
+ とある並びにはならない可能性があります。
93
+
94
+ これを回避するには
95
+ ```javascript
96
+ const headers = Object.keys(flatJson[0]);
97
+ ```
98
+ としないで、配列のリテラルで
99
+ ```javascript
100
+ const headers = [ 'project_id', 'project_name', 'custom.0.def_id', 'custom.0.def_value' ];
101
+ ```
102
+ としておくのが確実です。
103
+
104
+
105
+
106
+
107
+
108
+