回答編集履歴

11

テキスト修正

2020/07/03 06:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -154,7 +154,31 @@
154
154
 
155
155
 
156
156
 
157
- ご質問に書かれている要件の範囲を超えるものになりますが、先の**追記1**に対応したコードを挙げておきます。ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するために、lodashのgroupByとmapValues を入れ子にして使います。
157
+ ご質問に書かれている要件の範囲を超えるものになりますが、先の**追記1**に対応する例を挙げておきます。ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するために、lodashのgroupByとmapValues を入れ子にして使います。
158
+
159
+
160
+
161
+ ```javascript
162
+
163
+ const goal = _(start)
164
+
165
+ .groupBy(0)
166
+
167
+ .mapValues(arrays =>
168
+
169
+ _(arrays)
170
+
171
+ .groupBy(1)
172
+
173
+ .mapValues(subArrays => subArrays.map(array => array.slice(2)))
174
+
175
+ .value()
176
+
177
+ )
178
+
179
+ .value();
180
+
181
+ ```
158
182
 
159
183
 
160
184
 

10

テキスト修正

2020/07/03 06:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -154,7 +154,7 @@
154
154
 
155
155
 
156
156
 
157
- ご質問に書かれている要件の範囲を超えるものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するコード例、参考まで挙げおきます。
157
+ ご質問に書かれている要件の範囲を超えるものになりますが、先の**追記1**に対応したコードを挙げておきます。ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するために、lodashのgroupByとmapValues 入れ子使います。
158
158
 
159
159
 
160
160
 

9

テキスト修正

2020/07/03 06:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -154,7 +154,7 @@
154
154
 
155
155
 
156
156
 
157
- ご質問に書かれているご説明やコードが表す要件を逸脱するものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するコード例を、参考までに挙げておきます。
157
+ ご質問に書かれている要件の範囲超えるものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するコード例を、参考までに挙げておきます。
158
158
 
159
159
 
160
160
 

8

テキスト修正

2020/07/03 06:22

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -154,7 +154,7 @@
154
154
 
155
155
 
156
156
 
157
- 以下は、ある一つの企業の明細データの中に、複数の`expenseTitle`がる場合に対応するコード例です。
157
+ ご質問に書かれているご説明やコードが表す要件を逸脱するものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列含まれる場合に対応するコード例を、参考まに挙げておきます。
158
158
 
159
159
 
160
160
 

7

テキスト修正

2020/07/03 06:18

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  const goal = _(start)
28
28
 
29
- .groupBy(array => array[0])
29
+ .groupBy(0)
30
30
 
31
31
  .mapValues(arrays => (
32
32
 
@@ -147,3 +147,15 @@
147
147
 
148
148
 
149
149
  ただし、上記のコードも、追記1に書いたように、同じ企業名の明細データの中では、`start`の先頭に近いものに含まれる 第2要素が `goal` で `expenseTitle`として使われます。
150
+
151
+
152
+
153
+ ### 追記3
154
+
155
+
156
+
157
+ 以下は、ある一つの企業の明細データの中に、複数の`expenseTitle`がある場合に対応するコード例です。
158
+
159
+
160
+
161
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyGJdJq](https://codepen.io/jun68ykt/pen/dyGJdJq?editors=0012)

6

テキスト修正

2020/07/03 06:11

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- ただし、上記のコードでは、`expenseTitle` として、該当する社名をつ`array` のうち、`start`の先頭に近いものに含まれる第2番目の要素が使われます。ですので、もし例えば `start` が以下
59
+ ただし、上記のコードでは、る社名をつ`array` のうち、`start`の先頭に近いものに含まれる第2番目の要素が、`expenseTitle` として使われます。ですので、もし例えば `start` が以下
60
60
 
61
61
 
62
62
 
@@ -74,7 +74,7 @@
74
74
 
75
75
  ```
76
76
 
77
- のように、先頭要素の企業名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
77
+ のように、先頭要素の企業名は同じで2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
78
78
 
79
79
 
80
80
 

5

テキスト修正

2020/07/03 05:04

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- ### 補足
55
+ ### 追記1
56
56
 
57
57
 
58
58
 
@@ -107,3 +107,43 @@
107
107
 
108
108
 
109
109
  もし、上記だと、ご要望と違ってしまう場合は、ご質問に追記いただくかコメント頂ければと思います。
110
+
111
+
112
+
113
+
114
+
115
+ ### 追記2
116
+
117
+
118
+
119
+ lodash を使わずに、[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) を使ってもできます。
120
+
121
+
122
+
123
+ ```javascript
124
+
125
+ const goal = start.reduce((obj, array) => {
126
+
127
+ const [company, expenseTitle, expenseDetail, ...rest] = array;
128
+
129
+ if (!obj[company]) {
130
+
131
+ obj[company] = { expenseTitle, arrays: [] };
132
+
133
+ }
134
+
135
+ obj[company].arrays.push([expenseDetail, '', ...rest]);
136
+
137
+ return obj;
138
+
139
+ }, {});
140
+
141
+ ```
142
+
143
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/rNxpGZG](https://codepen.io/jun68ykt/pen/rNxpGZG?editors=0012)
144
+
145
+
146
+
147
+
148
+
149
+ ただし、上記のコードも、追記1に書いたように、同じ企業名の明細データの中では、`start`の先頭に近いものに含まれる 第2要素が `goal` で `expenseTitle`として使われます。

4

テキスト修正

2020/07/03 01:04

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,8 +1,16 @@
1
1
  こんにちは
2
+
3
+ ご質問に、
2
4
 
3
5
 
4
6
 
7
+ > もっと良い方法があればご教授頂けると助かります。
8
+
9
+
10
+
5
- 配列やオブジェクトの操作で便利なライブラリ[lodash](https://lodash.com) の
11
+ とありましたので、配列やオブジェクトの操作で便利なライブラリ[lodash](https://lodash.com) を使う方法を挙げます。使うメソッドは以下2点です。
12
+
13
+
6
14
 
7
15
  - [_.groupBy](https://lodash.com/docs/#groupBy)
8
16
 
@@ -10,7 +18,7 @@
10
18
 
11
19
 
12
20
 
13
- を使うと以下のように書けます。
21
+ 上記を使って、以下のように書けます。
14
22
 
15
23
 
16
24
 

3

テキスト修正

2020/07/03 00:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -56,13 +56,13 @@
56
56
 
57
57
  const start = [
58
58
 
59
- ["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]
59
+ ["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000],
60
60
 
61
61
  ["株式会社トヨタ", "システム利用料の件", "システム利用料", 1, "個", 1000000],
62
62
 
63
63
  ["株式会社トヨタ", "システム利用料の件", "その他費用2", 1, "個", 10000]
64
64
 
65
- ]
65
+ ];
66
66
 
67
67
  ```
68
68
 
@@ -94,6 +94,8 @@
94
94
 
95
95
  ```
96
96
 
97
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/wvMprXB](https://codepen.io/jun68ykt/pen/wvMprXB?editors=0012)
98
+
97
99
 
98
100
 
99
101
  もし、上記だと、ご要望と違ってしまう場合は、ご質問に追記いただくかコメント頂ければと思います。

2

テキスト修正

2020/07/03 00:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
  ```
68
68
 
69
- のように、先頭要素の名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
69
+ のように、先頭要素の企業名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
70
70
 
71
71
 
72
72
 

1

テキスト修正

2020/07/03 00:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  expenseTitle: arrays[0][1],
28
28
 
29
- arrays: arrays.map(array => array.slice(2))
29
+ arrays: arrays.map(array => [array[2], '', ...array.slice(3)])
30
30
 
31
31
  }))
32
32
 
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
 
41
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/xxZpXOX](https://codepen.io/jun68ykt/pen/xxZpXOX?editors=0012)
41
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/jOWYGzq](https://codepen.io/jun68ykt/pen/jOWYGzq?editors=0012)
42
42
 
43
43
 
44
44
 
@@ -80,11 +80,11 @@
80
80
 
81
81
  arrays: [
82
82
 
83
- ["その他費用1", 1, "個", 1000000],
83
+ ["その他費用1", "", 1, "個", 1000000],
84
84
 
85
- ["システム利用料", 1, "個", 1000000],
85
+ ["システム利用料", "", 1, "個", 1000000],
86
86
 
87
- ["その他費用2", 1, "個", 10000]
87
+ ["その他費用2", "", 1, "個", 10000]
88
88
 
89
89
  ]
90
90