回答編集履歴

22

テキスト追加

2020/03/29 01:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
   ・末尾の要素を除いた配列(例: `["a", "b"]` )を、**キー配列**と呼ぶ。
20
20
 
21
-  ・末尾の要素の数値(例: `10`) のことを、単に **数値** と呼ぶ。
21
+  ・末尾の要素(例: `10`) のことを、単に **数値** と呼ぶ。
22
22
 
23
23
 
24
24
 

21

テキスト追加

2020/03/29 01:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,4 +1,14 @@
1
1
  すでにベストアンサーが決まった後に失礼します。
2
+
3
+
4
+
5
+
6
+
7
+ ### 考え方
8
+
9
+
10
+
11
+
2
12
 
3
13
  この回答では、考え方として以下の**1.**〜 **4. **の考え方によるアプローチを採ります。
4
14
 
@@ -38,7 +48,7 @@
38
48
 
39
49
 
40
50
 
41
-
51
+ ### コード例
42
52
 
43
53
 
44
54
 

20

テキスト追加

2020/03/28 23:43

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,20 +1,44 @@
1
1
  すでにベストアンサーが決まった後に失礼します。
2
2
 
3
- この回答では、考え方として以下の1.〜 4. の考え方によるアプローチを採ります。
3
+ この回答では、考え方として以下の**1.****4. **の考え方によるアプローチを採ります。
4
4
 
5
5
 
6
6
 
7
- 1. 説明の便宜上、`data` の要素である配列から、末尾の要素を除いた配列(例: `["a", "b"]`)**キー配列**と呼ぶ。
7
+ **1.**説明の便宜上、`data` の要素である配列(例: `["a","b",10]` )について
8
8
 
9
- 2. 所与の `data` からまず以下の2点を作成
9
+  ・末尾要素を除いた配列(例: `["a", "b"]` )を**キー配列**と呼ぶ。
10
10
 
11
- (ⅰ)`totals`:合計値情報が格納されたオブジェクト
11
+  ・末尾の要素の数値(例: `10`) ことを、単に **数値** と呼ぶ。
12
12
 
13
- (ⅱ)`keys` : `data` の要素に出現するキー配列を、出現順に、かつ、**重複なく**含む配列
14
13
 
15
- 3. 上記2.(ⅰ)のオブジェクト `totals` には、キー配列が例えば `["a", "b"]` である`data`要素の末尾の数の合計(ご質問にあるサンプルだと **30**)が `totals.a.b` に格納されるようにする。
16
14
 
15
+ **2.**所与の `data` から、まず以下の2点を作成
16
+
17
+  (ⅰ)`totals`:各キー配列別の数値の合計が格納されたオブジェクト
18
+
19
+  (ⅱ)`keys` : `data` の要素に出現するキー配列を、出現順に、かつ、**重複なく**含む配列
20
+
21
+
22
+
23
+ **3.**上記2.(ⅰ)のオブジェクト `totals` には、キー配列が例えば `["a", "b"]` である数値の合計(ご質問にあるサンプルだと **30**)が `totals.a.b` に格納されるようにする。
24
+
25
+ ・従って、ご質問の例だと、 `totals` は以下のようなオブジェクトになる。
26
+
27
+ ```javascript
28
+
29
+ // totals の例
30
+
31
+ { a: { b: 30, c: 70, d: 50 } }
32
+
33
+ ```
34
+
35
+
36
+
17
- 4. オブジェクト `totals` と `keys` から、結果として望ましい形式の配列 `result` を得る。
37
+ **4.**オブジェクト `totals` と `keys` から、結果として望ましい形式の配列 `result` を得る。
38
+
39
+
40
+
41
+
18
42
 
19
43
 
20
44
 

19

テキスト追加

2020/03/28 23:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,20 +1,24 @@
1
1
  すでにベストアンサーが決まった後に失礼します。
2
2
 
3
- この回答では、考え方として以下のアプローチを採ります。
3
+ この回答では、考え方として以下の1.〜 4. の考え方によるアプローチを採ります。
4
4
 
5
5
 
6
6
 
7
- - 所与 `data` から、まず合計値情報が格納されオブジェクト `totals`を作る
7
+ 1. 説明便宜上、`data` の要素である配列から、末尾要素を除い配列(例: `["a", "b"]`)、**キー配列**と呼ぶ
8
8
 
9
- - オブジェクト `totals` には末尾除く要素がたとえば `["a", "b"]` である配列の末尾の数の合計(ご質問にあるサンプルだと **30**)が `totals.a.b` に格納されるようにする。
9
+ 2. 所与の `data` からまず以下の2点作成
10
10
 
11
- - 上記を実現するために、[lodash](https://lodash.com/) を使用
11
+ (ⅰ)`totals`:合計値の情報が格納されたオブジェクト
12
12
 
13
+ (ⅱ)`keys` : `data` の要素に出現するキー配列を、出現順に、かつ、**重複なく**含む配列
14
+
15
+ 3. 上記2.(ⅰ)のオブジェクト `totals` には、キー配列が例えば `["a", "b"]` である`data`要素の末尾の数の合計(ご質問にあるサンプルだと **30**)が `totals.a.b` に格納されるようにする。
16
+
13
- - オブジェクト `totals` から、結果として望ましい形式の配列 `result` を得る。
17
+ 4. オブジェクト `totals` と `keys` から、結果として望ましい形式の配列 `result` を得る。
14
18
 
15
19
 
16
20
 
17
- 以下は、上記の考え方によるコードです。
21
+ 以下は、上記の考え方によるコードです。配列やオブジェクトの操作で便利なライブラリ [lodash](https://lodash.com/) を使用しています。
18
22
 
19
23
 
20
24
 
@@ -54,7 +58,7 @@
54
58
 
55
59
 
56
60
 
57
- - `totals`を作る際のキーに対する値の取得、設定および存在確認: [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has)
61
+ - `totals`のキー配列に対する値の取得、設定および存在確認: [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has)
58
62
 
59
63
  - 配列から最後の要素を取得: [_.last](https://lodash.com/docs/#last)
60
64
 

18

テキスト追加

2020/03/28 22:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,20 +1,22 @@
1
1
  すでにベストアンサーが決まった後に失礼します。
2
2
 
3
- この回答では、考え方として
3
+ この回答では、考え方として以下のアプローチを採ります。
4
4
 
5
5
 
6
6
 
7
- - 末尾を除く要素がたとえば、`["a", "b"]` である配列の末尾の数の合計値(ご質問にあるサンプルだと **30**)、 `totals.a.b` に格納されているようなオブジェクト`totals`を作り、そこから結果の配列を得る。
7
+ - 所与の `data` から、まず合計値の情報が格納されオブジェクト `totals`を作る。
8
8
 
9
+ - オブジェクト `totals` には、末尾を除く要素がたとえば `["a", "b"]` である配列の末尾の数の合計(ご質問にあるサンプルだと **30**)が `totals.a.b` に格納されるようにする。
9
10
 
11
+ - 上記を実現するために、[lodash](https://lodash.com/) を使用
10
12
 
11
- という手順を踏みます。また、上記を実現するために、[lodash](https://lodash.com/)使います
13
+ - オブジェクト `totals` から、結果として望ましい形式の配列 `result`得る
12
-
13
-
14
14
 
15
15
 
16
16
 
17
17
  以下は、上記の考え方によるコードです。
18
+
19
+
18
20
 
19
21
  ```javascript
20
22
 

17

テキスト追加

2020/03/28 22:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  - `totals`を作る際のキーに対する値の取得、設定および存在確認: [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has)
56
56
 
57
- - 配列最後の要素取得: [_.last](https://lodash.com/docs/#last)
57
+ - 配列から最後の要素取得: [_.last](https://lodash.com/docs/#last)
58
58
 
59
59
  - 配列から最後の要素を除いた配列の取得: [_.initial](https://lodash.com/docs/#initial)
60
60
 

16

テキスト追加

2020/03/28 02:44

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -8,15 +8,9 @@
8
8
 
9
9
 
10
10
 
11
- という手順を踏みます。
11
+ という手順を踏みます。また、上記を実現するために、[lodash](https://lodash.com/) を使います。
12
12
 
13
13
 
14
-
15
- [lodash](https://lodash.com/) を使うコードを回答します。
16
-
17
-
18
-
19
- 具体的には、
20
14
 
21
15
 
22
16
 

15

テキスト追加

2020/03/28 02:11

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,24 +1,22 @@
1
1
  すでにベストアンサーが決まった後に失礼します。
2
+
3
+ この回答では、考え方として
2
4
 
3
5
 
4
6
 
5
- [lodash](https://lodash.com/) を使うコードを回答します。具体的は、以下のような手順で結果を得ます
7
+ - 末尾を除く要素がたとえば、`["a", "b"]` である配列の末尾の数の合計値(ご質問にあるサンプルだと **30**)が、 `totals.a.b`格納されているようなオブジェクト`totals`を作り、そこから結果の配列を得
6
8
 
7
9
 
8
10
 
9
- - 末尾を除く要素がたとえば、`["a", "b"]` である配列の末尾の数の合計値(ご質問にあるサンプルだと **30**)が、 `totals.a.b` に格納されているようなオブジェクト`totals`を作り、そこから結果の配列を得ます。
10
-
11
- - 上記の `totals`を作るために、 [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使います。
12
-
13
- - また、配列の最後の要素の取得に [_.last](https://lodash.com/docs/#last) を、
14
-
15
- - 最後の要素を除た配列得るために [_.initial](https://lodash.com/docs/#initial) を使います。
11
+ う手順踏みます。
16
-
17
-  
18
12
 
19
13
 
20
14
 
21
-  
15
+ [lodash](https://lodash.com/) を使うコードを回答します。
16
+
17
+
18
+
19
+ 具体的には、
22
20
 
23
21
 
24
22
 
@@ -54,11 +52,31 @@
54
52
 
55
53
  const result = keys.map(k => [...k, _.get(totals, k)]);
56
54
 
55
+ ```
56
+
57
+ 上記のコードで使っている lodash のメソッドは以下です。
58
+
59
+
60
+
61
+ - `totals`を作る際のキーに対する値の取得、設定および存在確認: [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has)
62
+
63
+ - 配列の最後の要素の取得: [_.last](https://lodash.com/docs/#last)
64
+
65
+ - 配列から最後の要素を除いた配列の取得: [_.initial](https://lodash.com/docs/#initial)
57
66
 
58
67
 
59
68
 
60
69
 
61
- ```
70
+
71
+
72
+
73
+  
74
+
75
+
76
+
77
+  
78
+
79
+
62
80
 
63
81
 
64
82
 
@@ -67,3 +85,9 @@
67
85
 
68
86
 
69
87
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/LYVMyMP?editors=0012](https://codepen.io/jun68ykt/pen/LYVMyMP?editors=0012)
88
+
89
+
90
+
91
+
92
+
93
+ 以上、参考になれば幸いです。

14

テキスト追加

2020/03/28 02:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- - たとえば、先頭要素が`["a", "b"]` である配列の末尾の数の合計値(ご質問にあるサンプルだと **30**)が、 `totals.a.b` に格納されているようなオブジェクト`totals`を作り、そこから結果の配列を得ます。
9
+ - 末尾を除く要素がたとえば、`["a", "b"]` である配列の末尾の数の合計値(ご質問にあるサンプルだと **30**)が、 `totals.a.b` に格納されているようなオブジェクト`totals`を作り、そこから結果の配列を得ます。
10
10
 
11
11
  - 上記の `totals`を作るために、 [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使います。
12
12
 

13

テキスト追加

2020/03/28 01:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,179 +2,11 @@
2
2
 
3
3
 
4
4
 
5
-
6
-
7
- [lodash](https://lodash.com/) を使うコードを回答します。使うのは、 [_.groupBy](https://lodash.com/docs/#groupBy) と [_.mapValues](https://lodash.com/docs/#mapValues) です。
5
+ [lodash](https://lodash.com/) を使うコードを回答します。具体的には、以下のような手順結果を得ます。
8
6
 
9
7
 
10
8
 
11
- ### 1.グループ化したオブジェクトを得る
12
-
13
-
14
-
15
- `data` の要素である配列を、合計する配列ごとにグループ化したオブジェクトを作ります。オブジェクトのキーとなる文字列としてJSONを採用することにして、キーを得る関数 `key` を以下のように作っておきます。
16
-
17
-
18
-
19
- ```javascript
20
-
21
- const key = ary => JSON.stringify(ary.slice(0, 2));
22
-
23
- ```
24
-
25
-
26
-
27
- たとえば、`key(["a", "b", 10])` は、配列 **["a", "b"]** をJSONにした、`["a","b"]`という文字列を返します。
28
-
29
-
30
-
31
- 上記の `key` を使って、グループ化したオブジェクトは以下によって得られます。
32
-
33
-
34
-
35
- ```javascript
36
-
37
- const objGroups = _.groupBy(data, key);
38
-
39
- ```
40
-
41
- 得られる`objGroups` の内容は、以下のようなものになります。
42
-
43
- ```
44
-
45
- {
46
-
47
- '["a","b"]': [["a", "b", 10], ["a", "b", 20]],
48
-
49
- '["a","c"]': [["a", "c", 30], ["a", "c", 40]],
50
-
51
- '["a","d"]': [["a", "c", 50]],
52
-
53
- }
54
-
55
- ```
56
-
57
-
58
-
59
- ### 2. 各グループごとの合計を計算する
60
-
61
-
62
-
63
- 上記の 1. で得られたオブジェクト `objGroups` から、各キーごとにグループ化された配列の第3要素の合計が値となるようなオブジェクト `objTotals` を作ります。
64
-
65
-
66
-
67
- 合計を計算する補助的な関数を以下のように作っておきます。
68
-
69
-
70
-
71
- ```javascript
72
-
73
- const totalize = data => data.reduce((total, ary) => total + ary[2], 0);
74
-
75
- ```
76
-
77
-
78
-
79
- 上記の `totalize` を、 [_.mapValues](https://lodash.com/docs/#mapValues) の第2引数に使うことで、以下によって `objTotals` が得られます。
80
-
81
- ```javascript
82
-
83
- const objTotals = _.mapValues(objGroups, totalize);
84
-
85
- ```
86
-
87
-
88
-
89
- 得られる`objTotals` の内容は、以下のようなものになります。
90
-
91
- ```
92
-
93
- {
94
-
95
- '["a","b"]': 30,
96
-
97
- '["a","c"]': 70,
98
-
99
- '["a","d"]': 50
100
-
101
- }
102
-
103
- ```
104
-
105
-
106
-
107
-
108
-
109
- ### 3. 結果として望ましい形の配列を得る
110
-
111
-
112
-
113
- 上記 2. で得られた `objTotals` を、最終的に得たい形の配列にします。その際に、キーをJSONから配列に戻すのと、オブジェクトを経由しているので、ソートして結果を得るようにします。
114
-
115
-
116
-
117
- まず、ソートで使う比較関数を以下のように用意しておきます。
118
-
119
-
120
-
121
- ```javascript
122
-
123
- const compare = (a, b) => a[0].localeCompare(b[0]) || a[1].localeCompare(b[1]);
124
-
125
- ```
126
-
127
-
128
-
129
- 上記の `compare` 使って、最終的に得たい配列 `result` は、以下によって得られます。
130
-
131
-
132
-
133
- ```javascript
134
-
135
- const result = Object.entries(objTotals)
136
-
137
- .map(([key, total]) => [...JSON.parse(key), total])
138
-
139
- .sort(compare);
140
-
141
- ```
142
-
143
- ```
144
-
145
- [ ["a","b",30], ["a","c",70], ["a","d",50] ]
146
-
147
- ```
148
-
149
-
150
-
151
-   
152
-
153
-   
154
-
155
-  
156
-
157
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/QWbzGbd?editors=0012](https://codepen.io/jun68ykt/pen/QWbzGbd?editors=0012)
158
-
159
-
160
-
161
-
162
-
163
- 参考になれば幸いです。
164
-
165
-
166
-
167
-
168
-
169
- ### 別解
170
-
171
-
172
-
173
- 同じく lodash を使った例です。
174
-
175
- こちらは、
176
-
177
- - 先頭要素が`["a", "b"]` である配列の末尾の数の合計値 30 が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。
9
+ - たとえば、先頭要素が`["a", "b"]` である配列の末尾の数の合計値(ご質問にあるサンプルだと **30**) `totals.a.b` に格納さているようなオブジェクト`totals`を作り、そこから結果の配列を得ます。
178
10
 
179
11
  - 上記の `totals`を作るために、 [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使います。
180
12
 
@@ -182,7 +14,15 @@
182
14
 
183
15
  - 最後の要素を除いた配列を得るために [_.initial](https://lodash.com/docs/#initial) を使います。
184
16
 
17
+  
185
18
 
19
+
20
+
21
+  
22
+
23
+
24
+
25
+ 以下は、上記の考え方によるコードです。
186
26
 
187
27
  ```javascript
188
28
 
@@ -200,9 +40,9 @@
200
40
 
201
41
  else {
202
42
 
43
+ _.set(obj, k, v);
44
+
203
45
  keys.push(k);
204
-
205
- _.set(obj, k, v);
206
46
 
207
47
  }
208
48
 
@@ -222,4 +62,8 @@
222
62
 
223
63
 
224
64
 
65
+ 以下は、上記のコードを動作確認するためのサンプルです。動作確認のため、`data`に要素を追加しています。
66
+
67
+
68
+
225
69
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/LYVMyMP?editors=0012](https://codepen.io/jun68ykt/pen/LYVMyMP?editors=0012)

12

テキスト追加

2020/03/28 01:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -12,13 +12,13 @@
12
12
 
13
13
 
14
14
 
15
- `data` の要素である配列を、合計するものごとにグループ化したオブジェクトを作ります。まず、このオブジェクトのキーとなる文字列をる関数を以下のように作っておきます。
15
+ `data` の要素である配列を、合計する配列ごとにグループ化したオブジェクトを作ります。オブジェクトのキーとなる文字列としてJSON採用すことにして、キーを得る関数 `key` を以下のように作っておきます。
16
-
17
-
18
-
16
+
17
+
18
+
19
- ```javascript
19
+ ```javascript
20
-
20
+
21
- const key = (ary) => JSON.stringify(ary.slice(0, 2));
21
+ const key = ary => JSON.stringify(ary.slice(0, 2));
22
22
 
23
23
  ```
24
24
 

11

テキスト追加

2020/03/28 01:17

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -174,7 +174,7 @@
174
174
 
175
175
  こちらは、
176
176
 
177
- - `["a", "b"]` の合計値が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。
177
+ - 先頭要素が`["a", "b"]` である配列末尾の数の合計値 30 が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。
178
178
 
179
179
  - 上記の `totals`を作るために、 [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使います。
180
180
 

10

テキスト追加

2020/03/28 01:03

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -180,7 +180,7 @@
180
180
 
181
181
  - また、配列の最後の要素の取得に [_.last](https://lodash.com/docs/#last) を、
182
182
 
183
- - 最後の要素を除配列を得るために [_.initial](https://lodash.com/docs/#initial) を使います。
183
+ - 最後の要素を除いた配列を得るために [_.initial](https://lodash.com/docs/#initial) を使います。
184
184
 
185
185
 
186
186
 

9

テキスト追加

2020/03/28 01:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -212,7 +212,7 @@
212
212
 
213
213
 
214
214
 
215
- const result = keys.map(key => [...k, _.get(totals, k)]);
215
+ const result = keys.map(k => [...k, _.get(totals, k)]);
216
216
 
217
217
 
218
218
 

8

テキスト追加

2020/03/28 00:59

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -170,7 +170,17 @@
170
170
 
171
171
 
172
172
 
173
- 同じく lodash を使った例です。こちらは [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使って、 `["a", "b"]` の合計値が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。また、配列の最後の要素の取得には、[_.last](https://lodash.com/docs/#last)、最後の要素を除く配列を得るために、[_.initial](https://lodash.com/docs/#initial) を使います。
173
+ 同じく lodash を使った例です。
174
+
175
+ こちらは、
176
+
177
+ - `["a", "b"]` の合計値が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。
178
+
179
+ - 上記の `totals`を作るために、 [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使います。
180
+
181
+ - また、配列の最後の要素の取得に [_.last](https://lodash.com/docs/#last) を、
182
+
183
+ - 最後の要素を除く配列を得るために [_.initial](https://lodash.com/docs/#initial) を使います。
174
184
 
175
185
 
176
186
 
@@ -202,7 +212,7 @@
202
212
 
203
213
 
204
214
 
205
- const result = keys.map(key => [...key, _.get(totals, key)]);
215
+ const result = keys.map(key => [...k, _.get(totals, k)]);
206
216
 
207
217
 
208
218
 

7

テキスト追加

2020/03/28 00:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -178,7 +178,7 @@
178
178
 
179
179
 
180
180
 
181
- const [obj, keys] = data.reduce(([obj, keys], ary) => {
181
+ const [totals, keys] = data.reduce(([obj, keys], ary) => {
182
182
 
183
183
  const [k, v] = [_.initial(ary), _.last(ary)];
184
184
 
@@ -202,7 +202,9 @@
202
202
 
203
203
 
204
204
 
205
- const result = keys.map(key => [...key, _.get(obj, key)]);
205
+ const result = keys.map(key => [...key, _.get(totals, key)]);
206
+
207
+
206
208
 
207
209
 
208
210
 

6

テキスト追加

2020/03/28 00:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -170,7 +170,7 @@
170
170
 
171
171
 
172
172
 
173
- 同じく lodash を使った例です。こちらは [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使って、 `["a", "b"]` の合計値が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。
173
+ 同じく lodash を使った例です。こちらは [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使って、 `["a", "b"]` の合計値が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。また、配列の最後の要素の取得には、[_.last](https://lodash.com/docs/#last)、最後の要素を除く配列を得るために、[_.initial](https://lodash.com/docs/#initial) を使います。
174
174
 
175
175
 
176
176
 
@@ -180,7 +180,7 @@
180
180
 
181
181
  const [obj, keys] = data.reduce(([obj, keys], ary) => {
182
182
 
183
- const [k, v] = [ary.slice(0, ary.length-1), ary[ary.length-1]];
183
+ const [k, v] = [_.initial(ary), _.last(ary)];
184
184
 
185
185
  if (_.has(obj, k)) {
186
186
 

5

テキスト追加

2020/03/28 00:47

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -170,7 +170,7 @@
170
170
 
171
171
 
172
172
 
173
- 同じく lodash を使った例です。こちらは [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使って、 `["a", "b"]` の合計値が `obj.a.b` で得られるようなオブジェクト `obj`を作り、そこから結果の配列を得ます。
173
+ 同じく lodash を使った例です。こちらは [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使って、 `["a", "b"]` の合計値が `totals.a.b` で得られるようなオブジェクト `totals`を作り、そこから結果の配列を得ます。
174
174
 
175
175
 
176
176
 

4

テキスト追加

2020/03/28 00:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -180,9 +180,7 @@
180
180
 
181
181
  const [obj, keys] = data.reduce(([obj, keys], ary) => {
182
182
 
183
- const k = ary.slice(0, ary.length-1),
183
+ const [k, v] = [ary.slice(0, ary.length-1), ary[ary.length-1]];
184
-
185
- v = ary[ary.length-1];
186
184
 
187
185
  if (_.has(obj, k)) {
188
186
 

3

テキスト追加

2020/03/28 00:26

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -170,39 +170,23 @@
170
170
 
171
171
 
172
172
 
173
- JavaScript標準のMapではなく、[immutable-js](https://immutable-js.github.io/immutable-js/) [Map](https://immutable-js.github.io/immutable-js/docs/#/Map) を使ます。
174
-
175
-
176
-
177
- ```javascript
178
-
179
-
180
-
181
- const { Map } = Immutable;
182
-
183
-
184
-
185
- const data = [
186
-
187
- ["a","b",10], ["x", "y", "z", 100], ["a","c",30],
188
-
189
- ["a","b",20], ["a","c",40], ["x", "y", "z", 200],
190
-
191
- ["a","d",50]
192
-
193
- ];
194
-
195
-
196
-
197
- const [map, keys] = data.reduce(([m, keys], ary) => {
173
+ 同じく lodash を使った例す。こちら [_.get](https://lodash.com/docs/#get), [_.set](https://lodash.com/docs/#set), [_.has](https://lodash.com/docs/#has) を使って、 `["a", "b"]` の合計値が、 `obj.a.b` で得られるようなオブジェクト `obj`を作り、そこから結果の配列を得ます。
174
+
175
+
176
+
177
+ ```javascript
178
+
179
+
180
+
181
+ const [obj, keys] = data.reduce(([obj, keys], ary) => {
198
182
 
199
183
  const k = ary.slice(0, ary.length-1),
200
184
 
201
185
  v = ary[ary.length-1];
202
186
 
203
- if (m.hasIn(k)) {
187
+ if (_.has(obj, k)) {
204
-
188
+
205
- m = m.setIn(k, m.getIn(k) + v);
189
+ _.set(obj, k, _.get(obj, k) + v);
206
190
 
207
191
  }
208
192
 
@@ -210,32 +194,22 @@
210
194
 
211
195
  keys.push(k);
212
196
 
213
- m = m.setIn(k, v);
197
+ _.set(obj, k, v);
214
198
 
215
199
  }
216
200
 
217
- return [m, keys];
201
+ return [obj, keys];
218
-
202
+
219
- }, [Map(), []]);
203
+ }, [{}, []]);
220
-
221
-
222
-
204
+
205
+
206
+
223
- const result = keys.map(key => [...key, map.getIn(key)]);
207
+ const result = keys.map(key => [...key, _.get(obj, key)]);
224
-
225
-
226
-
208
+
209
+
210
+
227
- ```
211
+ ```
228
-
229
- 上記によって`result`には、以下が得られます。
212
+
230
-
231
-
232
-
233
- ```
213
+
234
-
235
- [ ["a","b",30], ["x", "y", "z", 300], ["a","c",70], ["a","d",50] ]
214
+
236
-
237
- ```
238
-
239
-
240
-
241
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/wvaRdPg?editors=0012](https://codepen.io/jun68ykt/pen/wvaRdPg?editors=0012)
215
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/LYVMyMP?editors=0012](https://codepen.io/jun68ykt/pen/LYVMyMP?editors=0012)

2

テキスト追加

2020/03/27 20:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -194,86 +194,48 @@
194
194
 
195
195
 
196
196
 
197
- const obj = data.reduce((m, ary) => {
198
-
199
- const key = ary.slice(0, ary.length-1);
200
-
201
- const value = ary[ary.length-1];
202
-
203
- return m.setIn(key, (m.getIn(key) || 0) + value);
204
-
205
- }, Map()).toJS();
206
-
207
-
208
-
209
-
210
-
211
- ```
212
-
213
-
214
-
215
- 上記によって、`obj`には、下記のようなオブジェクトが得られます。
216
-
217
- ```
218
-
219
- { a: { b: 30, c: 70, d: 50 }, x: { y: { z: 300 }}}
220
-
221
- ```
222
-
223
-
224
-
225
- 上記のオブジェクトから、結果として得たい配列を作る再帰関数 `getEntries` を、以下
226
-
227
- ```javascript
228
-
229
- const getEntries = (obj, path, result) => {
230
-
231
- if (!path) path = [];
232
-
233
- if (!result) result = [];
234
-
235
-
236
-
237
- Object.entries(obj).forEach(([k, v]) => {
238
-
239
- if (typeof v === 'number') {
240
-
241
- result.push([...path, k, v]);
242
-
243
- } else {
244
-
245
- getEntries(v, [...path, k], result);
246
-
247
- }
248
-
249
- })
250
-
251
- return result;
252
-
253
- }
254
-
255
- ```
256
-
257
- のように作成しておいて、
258
-
259
-
260
-
261
- ```javascript
262
-
263
- const result = getEntries(obj);
264
-
265
- ```
266
-
267
- とすると、`result`には、以下が得られます。
268
-
269
-
270
-
271
- ```
272
-
273
- [ ["a","b",30], ["a","c",70], ["a","d",50], ["x", "y", "z", 300] ]
274
-
275
- ```
276
-
277
-
278
-
279
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyowNjW?editors=0012](https://codepen.io/jun68ykt/pen/dyowNjW?editors=0012)
197
+ const [map, keys] = data.reduce(([m, keys], ary) => {
198
+
199
+ const k = ary.slice(0, ary.length-1),
200
+
201
+ v = ary[ary.length-1];
202
+
203
+ if (m.hasIn(k)) {
204
+
205
+ m = m.setIn(k, m.getIn(k) + v);
206
+
207
+ }
208
+
209
+ else {
210
+
211
+ keys.push(k);
212
+
213
+ m = m.setIn(k, v);
214
+
215
+ }
216
+
217
+ return [m, keys];
218
+
219
+ }, [Map(), []]);
220
+
221
+
222
+
223
+ const result = keys.map(key => [...key, map.getIn(key)]);
224
+
225
+
226
+
227
+ ```
228
+
229
+ 上記によって`result`には、以下が得られます。
230
+
231
+
232
+
233
+ ```
234
+
235
+ [ ["a","b",30], ["x", "y", "z", 300], ["a","c",70], ["a","d",50] ]
236
+
237
+ ```
238
+
239
+
240
+
241
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/wvaRdPg?editors=0012](https://codepen.io/jun68ykt/pen/wvaRdPg?editors=0012)

1

テキスト追加

2020/03/27 20:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -161,3 +161,119 @@
161
161
 
162
162
 
163
163
  参考になれば幸いです。
164
+
165
+
166
+
167
+
168
+
169
+ ### 別解
170
+
171
+
172
+
173
+ JavaScript標準のMapではなく、[immutable-js](https://immutable-js.github.io/immutable-js/) の [Map](https://immutable-js.github.io/immutable-js/docs/#/Map) を使います。
174
+
175
+
176
+
177
+ ```javascript
178
+
179
+
180
+
181
+ const { Map } = Immutable;
182
+
183
+
184
+
185
+ const data = [
186
+
187
+ ["a","b",10], ["x", "y", "z", 100], ["a","c",30],
188
+
189
+ ["a","b",20], ["a","c",40], ["x", "y", "z", 200],
190
+
191
+ ["a","d",50]
192
+
193
+ ];
194
+
195
+
196
+
197
+ const obj = data.reduce((m, ary) => {
198
+
199
+ const key = ary.slice(0, ary.length-1);
200
+
201
+ const value = ary[ary.length-1];
202
+
203
+ return m.setIn(key, (m.getIn(key) || 0) + value);
204
+
205
+ }, Map()).toJS();
206
+
207
+
208
+
209
+
210
+
211
+ ```
212
+
213
+
214
+
215
+ 上記によって、`obj`には、下記のようなオブジェクトが得られます。
216
+
217
+ ```
218
+
219
+ { a: { b: 30, c: 70, d: 50 }, x: { y: { z: 300 }}}
220
+
221
+ ```
222
+
223
+
224
+
225
+ 上記のオブジェクトから、結果として得たい配列を作る再帰関数 `getEntries` を、以下
226
+
227
+ ```javascript
228
+
229
+ const getEntries = (obj, path, result) => {
230
+
231
+ if (!path) path = [];
232
+
233
+ if (!result) result = [];
234
+
235
+
236
+
237
+ Object.entries(obj).forEach(([k, v]) => {
238
+
239
+ if (typeof v === 'number') {
240
+
241
+ result.push([...path, k, v]);
242
+
243
+ } else {
244
+
245
+ getEntries(v, [...path, k], result);
246
+
247
+ }
248
+
249
+ })
250
+
251
+ return result;
252
+
253
+ }
254
+
255
+ ```
256
+
257
+ のように作成しておいて、
258
+
259
+
260
+
261
+ ```javascript
262
+
263
+ const result = getEntries(obj);
264
+
265
+ ```
266
+
267
+ とすると、`result`には、以下が得られます。
268
+
269
+
270
+
271
+ ```
272
+
273
+ [ ["a","b",30], ["a","c",70], ["a","d",50], ["x", "y", "z", 300] ]
274
+
275
+ ```
276
+
277
+
278
+
279
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/dyowNjW?editors=0012](https://codepen.io/jun68ykt/pen/dyowNjW?editors=0012)