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

回答編集履歴

11

テキスト修正

2020/07/03 06:40

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -76,6 +76,18 @@
76
76
 
77
77
  ### 追記3
78
78
 
79
- ご質問に書かれている要件の範囲を超えるものになりますが、先の**追記1**に対応したコードを挙げておきます。ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するために、lodashのgroupByとmapValues を入れ子にして使います。
79
+ ご質問に書かれている要件の範囲を超えるものになりますが、先の**追記1**に対応する例を挙げておきます。ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するために、lodashのgroupByとmapValues を入れ子にして使います。
80
80
 
81
+ ```javascript
82
+ const goal = _(start)
83
+ .groupBy(0)
84
+ .mapValues(arrays =>
85
+ _(arrays)
86
+ .groupBy(1)
87
+ .mapValues(subArrays => subArrays.map(array => array.slice(2)))
88
+ .value()
89
+ )
90
+ .value();
91
+ ```
92
+
81
93
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyGJdJq](https://codepen.io/jun68ykt/pen/dyGJdJq?editors=0012)

10

テキスト修正

2020/07/03 06:40

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -76,6 +76,6 @@
76
76
 
77
77
  ### 追記3
78
78
 
79
- ご質問に書かれている要件の範囲を超えるものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するコード例を参考まで挙げおきます。
79
+ ご質問に書かれている要件の範囲を超えるものになりますが、先の**追記1**に対応したコードを挙げておきます。ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するためにlodashのgroupByとmapValues を入れ子使います。
80
80
 
81
81
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyGJdJq](https://codepen.io/jun68ykt/pen/dyGJdJq?editors=0012)

9

テキスト修正

2020/07/03 06:37

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -76,6 +76,6 @@
76
76
 
77
77
  ### 追記3
78
78
 
79
- ご質問に書かれているご説明やコードが表す要件を逸脱するものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するコード例を、参考までに挙げておきます。
79
+ ご質問に書かれている要件の範囲超えるものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列が含まれる場合に対応するコード例を、参考までに挙げておきます。
80
80
 
81
81
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyGJdJq](https://codepen.io/jun68ykt/pen/dyGJdJq?editors=0012)

8

テキスト修正

2020/07/03 06:22

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -76,6 +76,6 @@
76
76
 
77
77
  ### 追記3
78
78
 
79
- 以下は、ある一つの企業の明細データの中に、複数の`expenseTitle`がる場合に対応するコード例です。
79
+ ご質問に書かれているご説明やコードが表す要件を逸脱するものになりますが、ある一つの企業の明細データの中に、複数の`expenseTitle`に相当する文字列含まれる場合に対応するコード例を、参考まに挙げておきます。
80
80
 
81
81
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyGJdJq](https://codepen.io/jun68ykt/pen/dyGJdJq?editors=0012)

7

テキスト修正

2020/07/03 06:18

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  ```javascript
14
14
  const goal = _(start)
15
- .groupBy(array => array[0])
15
+ .groupBy(0)
16
16
  .mapValues(arrays => (
17
17
  {
18
18
  expenseTitle: arrays[0][1],
@@ -72,4 +72,10 @@
72
72
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/rNxpGZG](https://codepen.io/jun68ykt/pen/rNxpGZG?editors=0012)
73
73
 
74
74
 
75
- ただし、上記のコードも、追記1に書いたように、同じ企業名の明細データの中では、`start`の先頭に近いものに含まれる 第2要素が `goal` で `expenseTitle`として使われます。
75
+ ただし、上記のコードも、追記1に書いたように、同じ企業名の明細データの中では、`start`の先頭に近いものに含まれる 第2要素が `goal` で `expenseTitle`として使われます。
76
+
77
+ ### 追記3
78
+
79
+ 以下は、ある一つの企業の明細データの中に、複数の`expenseTitle`がある場合に対応するコード例です。
80
+
81
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyGJdJq](https://codepen.io/jun68ykt/pen/dyGJdJq?editors=0012)

6

テキスト修正

2020/07/03 06:11

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
  ### 追記1
29
29
 
30
- ただし、上記のコードでは、`expenseTitle` として、該当する社名をつ`array` のうち、`start`の先頭に近いものに含まれる第2番目の要素が使われます。ですので、もし例えば `start` が以下
30
+ ただし、上記のコードでは、る社名をつ`array` のうち、`start`の先頭に近いものに含まれる第2番目の要素が、`expenseTitle` として使われます。ですので、もし例えば `start` が以下
31
31
 
32
32
  ```
33
33
  const start = [
@@ -36,7 +36,7 @@
36
36
  ["株式会社トヨタ", "システム利用料の件", "その他費用2", 1, "個", 10000]
37
37
  ];
38
38
  ```
39
- のように、先頭要素の企業名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
39
+ のように、先頭要素の企業名は同じで2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
40
40
 
41
41
  ```
42
42
  {

5

テキスト修正

2020/07/03 05:04

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -25,7 +25,7 @@
25
25
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/jOWYGzq](https://codepen.io/jun68ykt/pen/jOWYGzq?editors=0012)
26
26
 
27
27
 
28
- ### 補足
28
+ ### 追記1
29
29
 
30
30
  ただし、上記のコードでは、`expenseTitle` として、該当する社名をもつ`array` のうち、`start`の先頭に近いものに含まれる第2番目の要素が使われます。ですので、もし例えば `start` が以下
31
31
 
@@ -52,4 +52,24 @@
52
52
  ```
53
53
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/wvMprXB](https://codepen.io/jun68ykt/pen/wvMprXB?editors=0012)
54
54
 
55
- もし、上記だと、ご要望と違ってしまう場合は、ご質問に追記いただくかコメント頂ければと思います。
55
+ もし、上記だと、ご要望と違ってしまう場合は、ご質問に追記いただくかコメント頂ければと思います。
56
+
57
+
58
+ ### 追記2
59
+
60
+ lodash を使わずに、[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) を使ってもできます。
61
+
62
+ ```javascript
63
+ const goal = start.reduce((obj, array) => {
64
+ const [company, expenseTitle, expenseDetail, ...rest] = array;
65
+ if (!obj[company]) {
66
+ obj[company] = { expenseTitle, arrays: [] };
67
+ }
68
+ obj[company].arrays.push([expenseDetail, '', ...rest]);
69
+ return obj;
70
+ }, {});
71
+ ```
72
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/rNxpGZG](https://codepen.io/jun68ykt/pen/rNxpGZG?editors=0012)
73
+
74
+
75
+ ただし、上記のコードも、追記1に書いたように、同じ企業名の明細データの中では、`start`の先頭に近いものに含まれる 第2要素が `goal` で `expenseTitle`として使われます。

4

テキスト修正

2020/07/03 01:04

投稿

jun68ykt
jun68ykt

スコア9058

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

3

テキスト修正

2020/07/03 00:40

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -27,10 +27,10 @@
27
27
 
28
28
  ```
29
29
  const start = [
30
- ["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]
30
+ ["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000],
31
31
  ["株式会社トヨタ", "システム利用料の件", "システム利用料", 1, "個", 1000000],
32
32
  ["株式会社トヨタ", "システム利用料の件", "その他費用2", 1, "個", 10000]
33
- ]
33
+ ];
34
34
  ```
35
35
  のように、先頭要素の企業名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
36
36
 
@@ -46,5 +46,6 @@
46
46
  }
47
47
  }
48
48
  ```
49
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/wvMprXB](https://codepen.io/jun68ykt/pen/wvMprXB?editors=0012)
49
50
 
50
51
  もし、上記だと、ご要望と違ってしまう場合は、ご質問に追記いただくかコメント頂ければと思います。

2

テキスト修正

2020/07/03 00:34

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -32,7 +32,7 @@
32
32
  ["株式会社トヨタ", "システム利用料の件", "その他費用2", 1, "個", 10000]
33
33
  ]
34
34
  ```
35
- のように、先頭要素の名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
35
+ のように、先頭要素の企業名は同じでも、2番目の要素が異なる`array`を含む場合であっても、`expenseTitle` としては、先頭に近い `["株式会社トヨタ", "システム開発費の件", "その他費用1", 1, "個", 1000000]` の `"システム開発費の件"` が使われて、`goal`は以下になります。
36
36
 
37
37
  ```
38
38
  {

1

テキスト修正

2020/07/03 00:31

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -12,13 +12,13 @@
12
12
  .mapValues(arrays => (
13
13
  {
14
14
  expenseTitle: arrays[0][1],
15
- arrays: arrays.map(array => array.slice(2))
15
+ arrays: arrays.map(array => [array[2], '', ...array.slice(3)])
16
16
  }))
17
17
  .value();
18
18
 
19
19
  ```
20
20
 
21
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/xxZpXOX](https://codepen.io/jun68ykt/pen/xxZpXOX?editors=0012)
21
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/jOWYGzq](https://codepen.io/jun68ykt/pen/jOWYGzq?editors=0012)
22
22
 
23
23
 
24
24
  ### 補足
@@ -39,9 +39,9 @@
39
39
  株式会社トヨタ: {
40
40
  expenseTitle: "システム開発費の件",
41
41
  arrays: [
42
- ["その他費用1", 1, "個", 1000000],
42
+ ["その他費用1", "", 1, "個", 1000000],
43
- ["システム利用料", 1, "個", 1000000],
43
+ ["システム利用料", "", 1, "個", 1000000],
44
- ["その他費用2", 1, "個", 10000]
44
+ ["その他費用2", "", 1, "個", 10000]
45
45
  ]
46
46
  }
47
47
  }