回答編集履歴
18
テキスト修正
answer
CHANGED
@@ -57,7 +57,7 @@
|
|
57
57
|
|
58
58
|
以上、参考になれば幸いです。
|
59
59
|
|
60
|
-
### 追記
|
60
|
+
### 追記1
|
61
61
|
|
62
62
|
補足ですが、上記に挙げたコードの中で、 `result5` から `result6` を得る以下の行
|
63
63
|
```javascript
|
@@ -69,4 +69,40 @@
|
|
69
69
|
```
|
70
70
|
- **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/3/](https://jsfiddle.net/jun68ykt/3tounhgL/3/)
|
71
71
|
|
72
|
-
[lodash](https://lodash.com/) はオブジェクトや配列の操作で便利なメソッドを提供しており、用途にうまく合ったメソッドがみつかると、コードを短くできることがあります。
|
72
|
+
[lodash](https://lodash.com/) はオブジェクトや配列の操作で便利なメソッドを提供しており、用途にうまく合ったメソッドがみつかると、コードを短くできることがあります。
|
73
|
+
|
74
|
+
### 追記2
|
75
|
+
|
76
|
+
`result5` からの合計処理だけではなく、ご質問に挙げられているソースコード全体について、リファクタ案を書いてみましたので、参考までに提示します。作成したコードは以下に上げています。
|
77
|
+
|
78
|
+
- GitHub: [jun68ykt/q204950](https://github.com/jun68ykt/q204950)
|
79
|
+
|
80
|
+
最終的な修正後のJavascriptのコードは以下です。
|
81
|
+
|
82
|
+
- jun68ykt/q204950: [main.js](https://github.com/jun68ykt/q204950/blob/master/main.js)
|
83
|
+
|
84
|
+
以下、各コミットを順を追って説明します。
|
85
|
+
|
86
|
+
- [initial commit](https://git.io/fj7WA) では、ご質問に挙げられているコードをそのままコピペしたうえで、HTML と JavaScript のファイルを分けました。
|
87
|
+
|
88
|
+
|
89
|
+
- [末尾に空文字列がある場合、これを除去](https://git.io/fj7Wh) :result2 を作るときに、元のコードだと、末尾に空文字列ができてしまうことがあるので、これを除く filter を追加しています。
|
90
|
+
|
91
|
+
|
92
|
+
- [result3 の作成にmapとsliceを使用](https://git.io/fj7lv): result2 から result3 を作る際に、map と slice を使うと短くできます。
|
93
|
+
|
94
|
+
|
95
|
+
- 以下は、 result3 から result4 を作る処理を3段階でリファクタしました。
|
96
|
+
(1) [result4 の作成部分を修正(その1)](https://git.io/fj7lU): 元のコードにある、 divide はかなり力作という感じで恐縮ですが、 `.divide(1)` と、要素が1個の配列に区切るならば、修正後のように短く書けます。
|
97
|
+
(2) [result4 の作成部分を修正(その2)](https://git.io/fj7lk) : result4 を作る2段階目です。map を二重にして、unshift を使わずに長さが 3 の配列を作ります。
|
98
|
+
- (3) [result4 の作成部分を修正(その3)](https://git.io/fj7lC) :上記(1)と(2)の処理をひとつにまとめました。
|
99
|
+
|
100
|
+
|
101
|
+
- [result5 の作成にreduceとfilterを使用](https://git.io/fj7l8) :result4 から result5 を作る処理を reduce と filter を使ってみました。元のコードでは、result5 は配列ですが、 `a`, `b` などがキーになるのでオブジェクトが得られるようにしています。
|
102
|
+
|
103
|
+
|
104
|
+
- 以下の2つは、先の回答に書いたコードを追加したものです。
|
105
|
+
(1) [result6 の作成を追加](https://git.io/fj7lu)
|
106
|
+
(2) [lodash の利用](https://git.io/fj7lz)
|
107
|
+
|
108
|
+
配列のメソッド、[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map) や [reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce), [filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) と[スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)は、配列やオブジェクトを処理するプログラムを書くときに、いろいろな場面で重宝します。
|
17
テキスト修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
> 最終的には配列内のa,b,c,dは消し、以下の様な形
|
16
16
|
|
17
|
-
の内容を持つオブジェクトを、 `result6` という変数
|
17
|
+
の内容を持つオブジェクトを、 `result6` という変数に得るためのコードを示します。
|
18
18
|
|
19
19
|
まず、以下のような関数`summarize(ary)` を作成します。
|
20
20
|
|
16
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
|
-
ご質問
|
3
|
+
ご質問を拝読しまして、 `result5` は以下のようなオブジェクトであると把握しました。
|
4
4
|
|
5
5
|
```javascript
|
6
6
|
{
|
@@ -10,11 +10,11 @@
|
|
10
10
|
d: [['x', 1, 'd'], ['x', 10, 'd']]
|
11
11
|
}
|
12
12
|
```
|
13
|
-
この回答では、上記のオブジェクト
|
13
|
+
この回答では、上記のオブジェクト `result5` に含まれる配列に対して集計処理を行って、ご質問にある
|
14
14
|
|
15
|
-
> 最終的には配列内のa,b,c,dは消し、以下の様な形
|
15
|
+
> 最終的には配列内のa,b,c,dは消し、以下の様な形
|
16
16
|
|
17
|
-
|
17
|
+
の内容を持つオブジェクトを、 `result6` という変数として得るためのコードを示します。
|
18
18
|
|
19
19
|
まず、以下のような関数`summarize(ary)` を作成します。
|
20
20
|
|
15
テキスト修正
answer
CHANGED
@@ -59,7 +59,7 @@
|
|
59
59
|
|
60
60
|
### 追記
|
61
61
|
|
62
|
-
補足ですが、上記に挙げたコードの中で、
|
62
|
+
補足ですが、上記に挙げたコードの中で、 `result5` から `result6` を得る以下の行
|
63
63
|
```javascript
|
64
64
|
const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
65
65
|
```
|
14
テキスト修正
answer
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
|
+
ご質問の理解として、 `result5` は、以下のようなオブジェクトであると認識しました。
|
4
|
+
|
5
|
+
```javascript
|
6
|
+
{
|
7
|
+
a: [['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']],
|
8
|
+
b: [['x', 100, 'b'], ['x', 10, 'b'], ['x', 100, 'b']],
|
9
|
+
c: [['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']],
|
10
|
+
d: [['x', 1, 'd'], ['x', 10, 'd']]
|
11
|
+
}
|
12
|
+
```
|
13
|
+
この回答では、上記のオブジェクトである `result5` に対して集計処理を行って、
|
14
|
+
|
15
|
+
> 最終的には配列内のa,b,c,dは消し、以下の様な形にしたいです。
|
16
|
+
|
17
|
+
と書かれている、望ましい内容を持つオブジェクトを、 `result6` という変数として得るためのコードを示します。
|
18
|
+
|
3
19
|
まず、以下のような関数`summarize(ary)` を作成します。
|
4
20
|
|
5
21
|
```javascript
|
@@ -27,16 +43,7 @@
|
|
27
43
|
```
|
28
44
|
を返します。
|
29
45
|
|
30
|
-
上記の `summarize(ary)`を使うと、
|
46
|
+
上記の `summarize(ary)`を使うと、冒頭に書いた `result5` から `result6` を得るには、以下のようにすればよいです。
|
31
|
-
```javascript
|
32
|
-
const result5 = {
|
33
|
-
a: [['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']],
|
34
|
-
b: [['x', 100, 'b'], ['x', 10, 'b'], ['x', 100, 'b']],
|
35
|
-
c: [['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']],
|
36
|
-
d: [['x', 1, 'd'], ['x', 10, 'd']]
|
37
|
-
};
|
38
|
-
```
|
39
|
-
の各エントリの値となっている配列を summarizeした配列に置き換えるには、以下のようにすればよいです。
|
40
47
|
|
41
48
|
```javascript
|
42
49
|
const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
@@ -52,7 +59,7 @@
|
|
52
59
|
|
53
60
|
### 追記
|
54
61
|
|
55
|
-
補足ですが、上記に挙げたコードの中で、以下の
|
62
|
+
補足ですが、上記に挙げたコードの中で、以下の `result5` から `result6` を得る行
|
56
63
|
```javascript
|
57
64
|
const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
58
65
|
```
|
13
テキスト修正
answer
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
```javascript
|
14
14
|
[['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']]
|
15
15
|
```
|
16
|
-
が与えられると、ご質問の要件に沿って、各要素の配列の先頭の文字ごとに、2番目の要素である数値を足し上げ
|
16
|
+
が与えられると、ご質問の要件に沿って、各要素の配列の先頭の文字ごとに、2番目の要素である数値を足し上げた配列
|
17
17
|
```javascript
|
18
18
|
[['x', 2000], ['y', 1001]]
|
19
19
|
```
|
12
テキスト修正
answer
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
|
30
30
|
上記の `summarize(ary)`を使うと、以下のオブジェクト `result5`
|
31
31
|
```javascript
|
32
|
-
|
32
|
+
const result5 = {
|
33
33
|
a: [['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']],
|
34
34
|
b: [['x', 100, 'b'], ['x', 10, 'b'], ['x', 100, 'b']],
|
35
35
|
c: [['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']],
|
@@ -39,14 +39,14 @@
|
|
39
39
|
の各エントリの値となっている配列を summarizeした配列に置き換えるには、以下のようにすればよいです。
|
40
40
|
|
41
41
|
```javascript
|
42
|
-
|
42
|
+
const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
43
43
|
```
|
44
44
|
|
45
|
-
上記により、`
|
45
|
+
上記により、`result6` には各配列が集計されているオブジェクトが入ります。
|
46
46
|
|
47
47
|
以下は、上記を動作確認するために jsFiddle に上げたものです。
|
48
48
|
|
49
|
-
- **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/
|
49
|
+
- **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/6/](https://jsfiddle.net/jun68ykt/sfuvgxm5/6/)
|
50
50
|
|
51
51
|
以上、参考になれば幸いです。
|
52
52
|
|
@@ -54,12 +54,12 @@
|
|
54
54
|
|
55
55
|
補足ですが、上記に挙げたコードの中で、以下の部分
|
56
56
|
```javascript
|
57
|
-
|
57
|
+
const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
58
58
|
```
|
59
59
|
については、lodash の [_.mapValues](https://lodash.com/docs/4.17.15#mapValues) を使うと、以下のように少し短く書けます。
|
60
60
|
```javascript
|
61
|
-
|
61
|
+
const result6 = _.mapValues(result5, summarize);
|
62
62
|
```
|
63
|
-
- **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/
|
63
|
+
- **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/3/](https://jsfiddle.net/jun68ykt/3tounhgL/3/)
|
64
64
|
|
65
65
|
[lodash](https://lodash.com/) はオブジェクトや配列の操作で便利なメソッドを提供しており、用途にうまく合ったメソッドがみつかると、コードを短くできることがあります。
|
11
テキスト修正
answer
CHANGED
@@ -56,8 +56,10 @@
|
|
56
56
|
```javascript
|
57
57
|
result5 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
58
58
|
```
|
59
|
-
については、
|
59
|
+
については、lodash の [_.mapValues](https://lodash.com/docs/4.17.15#mapValues) を使うと、以下のように少し短く書けます。
|
60
60
|
```javascript
|
61
61
|
result5 = _.mapValues(result5, summarize);
|
62
62
|
```
|
63
|
-
- **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/2/](https://jsfiddle.net/jun68ykt/3tounhgL/2/)
|
63
|
+
- **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/2/](https://jsfiddle.net/jun68ykt/3tounhgL/2/)
|
64
|
+
|
65
|
+
[lodash](https://lodash.com/) はオブジェクトや配列の操作で便利なメソッドを提供しており、用途にうまく合ったメソッドがみつかると、コードを短くできることがあります。
|
10
テキスト修正
answer
CHANGED
@@ -48,4 +48,16 @@
|
|
48
48
|
|
49
49
|
- **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/5/](https://jsfiddle.net/jun68ykt/sfuvgxm5/5/)
|
50
50
|
|
51
|
-
以上、参考になれば幸いです。
|
51
|
+
以上、参考になれば幸いです。
|
52
|
+
|
53
|
+
### 追記
|
54
|
+
|
55
|
+
補足ですが、上記に挙げたコードの中で、以下の部分
|
56
|
+
```javascript
|
57
|
+
result5 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
|
58
|
+
```
|
59
|
+
については、オブジェクトや配列の操作で便利なメソッドを提供している lodash の [_.mapValues](https://lodash.com/docs/4.17.15#mapValues) を使うと、以下のように少し短く書けます。
|
60
|
+
```javascript
|
61
|
+
result5 = _.mapValues(result5, summarize);
|
62
|
+
```
|
63
|
+
- **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/2/](https://jsfiddle.net/jun68ykt/3tounhgL/2/)
|
9
テキスト修正
answer
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
```javascript
|
22
22
|
[['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']]
|
23
23
|
```
|
24
|
-
が与えられた場合は、足し上げたうえで、
|
24
|
+
が与えられた場合は、足し上げたうえで、 先頭要素のアルファベット順に並び替えて、
|
25
25
|
```javascript
|
26
26
|
[['x', 1], ['y', 110]]
|
27
27
|
```
|
8
テキスト修正
answer
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
```
|
28
28
|
を返します。
|
29
29
|
|
30
|
-
上記の `summarize(ary)`を使うと、以下の
|
30
|
+
上記の `summarize(ary)`を使うと、以下のオブジェクト `result5`
|
31
31
|
```javascript
|
32
32
|
let result5 = {
|
33
33
|
a: [['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']],
|
7
テキスト修正
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
}
|
10
10
|
```
|
11
11
|
|
12
|
-
上記の関数`summarize(ary)`は、引数 `ary` に
|
12
|
+
上記の関数`summarize(ary)`は、引数 `ary` にたとえば
|
13
13
|
```javascript
|
14
14
|
[['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']]
|
15
15
|
```
|
6
テキスト修正
answer
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
```javascript
|
14
14
|
[['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']]
|
15
15
|
```
|
16
|
-
が与えられ
|
16
|
+
が与えられると、ご質問の要件に沿って、各要素の配列の先頭の文字ごとに、2番目の要素である数値を足し上げて、
|
17
17
|
```javascript
|
18
18
|
[['x', 2000], ['y', 1001]]
|
19
19
|
```
|
@@ -21,7 +21,7 @@
|
|
21
21
|
```javascript
|
22
22
|
[['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']]
|
23
23
|
```
|
24
|
-
が与えられた
|
24
|
+
が与えられた場合は、足し上げたうえで、 `'x'`, `'y'` の順に並び替えて、
|
25
25
|
```javascript
|
26
26
|
[['x', 1], ['y', 110]]
|
27
27
|
```
|
5
テキスト修正
answer
CHANGED
@@ -13,15 +13,15 @@
|
|
13
13
|
```javascript
|
14
14
|
[['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']]
|
15
15
|
```
|
16
|
-
が与えられたら、
|
16
|
+
が与えられたら、ご質問の要件に沿って、各要素の2番目の数値を足し上げて、
|
17
17
|
```javascript
|
18
18
|
[['x', 2000], ['y', 1001]]
|
19
19
|
```
|
20
|
-
を返します。引数 `ary` に
|
20
|
+
を返します。また、引数 `ary` に
|
21
21
|
```javascript
|
22
22
|
[['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']]
|
23
23
|
```
|
24
|
-
が与えられたら、`'x'`, `'y'` の順に並び替えて、
|
24
|
+
が与えられたら、足し上げたうえで、 `'x'`, `'y'` の順に並び替えて、
|
25
25
|
```javascript
|
26
26
|
[['x', 1], ['y', 110]]
|
27
27
|
```
|
4
テキスト修正
answer
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
3
|
まず、以下のような関数`summarize(ary)` を作成します。
|
4
|
-
|
4
|
+
|
5
5
|
```javascript
|
6
|
+
const summarize = (ary) => {
|
7
|
+
const map = ary.reduce((m, e) => m.set(e[0], (m.get(e[0]) || 0) + e[1]), new Map());
|
8
|
+
return [...map].sort( (e1,e2) => e1[0].localeCompare(e2[0]));
|
9
|
+
}
|
10
|
+
```
|
11
|
+
|
12
|
+
上記の関数`summarize(ary)`は、引数 `ary` に
|
13
|
+
```javascript
|
6
14
|
[['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']]
|
7
15
|
```
|
8
16
|
が与えられたら、
|
@@ -17,15 +25,8 @@
|
|
17
25
|
```javascript
|
18
26
|
[['x', 1], ['y', 110]]
|
19
27
|
```
|
20
|
-
を返します。
|
28
|
+
を返します。
|
21
29
|
|
22
|
-
```javascript
|
23
|
-
const summarize = (ary) => {
|
24
|
-
const map = ary.reduce((m, e) => m.set(e[0], (m.get(e[0]) || 0) + e[1]), new Map());
|
25
|
-
return [...map].sort( (e1,e2) => e1[0].localeCompare(e2[0]));
|
26
|
-
}
|
27
|
-
```
|
28
|
-
|
29
30
|
上記の `summarize(ary)`を使うと、以下の変数 `result5`
|
30
31
|
```javascript
|
31
32
|
let result5 = {
|
3
テキスト修正
answer
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
```javascript
|
18
18
|
[['x', 1], ['y', 110]]
|
19
19
|
```
|
20
|
-
を返します。このような `summarize(ary)` は、例
|
20
|
+
を返します。このような `summarize(ary)` は、いろいろな書き方が出来そうです。一例として、以下のように書けます。
|
21
21
|
|
22
22
|
```javascript
|
23
23
|
const summarize = (ary) => {
|
2
テキスト修正
answer
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
|
-
まず、以下のような関数
|
3
|
+
まず、以下のような関数`summarize(ary)` を作成します。
|
4
|
+
関数`summarize(ary)`は、引数 `ary` に
|
4
5
|
```javascript
|
5
6
|
[['x', 1000, 'a'], ['y', 1000, 'a'], ['y', 1, 'a'], ['x', 1000, 'a']]
|
6
7
|
```
|
7
|
-
が与えられたら、
|
8
|
+
が与えられたら、
|
8
9
|
```javascript
|
9
10
|
[['x', 2000], ['y', 1001]]
|
10
11
|
```
|
11
|
-
を返し
|
12
|
+
を返します。引数 `ary` に
|
12
13
|
```javascript
|
13
14
|
[['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']]
|
14
15
|
```
|
@@ -16,7 +17,7 @@
|
|
16
17
|
```javascript
|
17
18
|
[['x', 1], ['y', 110]]
|
18
19
|
```
|
19
|
-
を返します。このような `summarize(ary)` は以下のように書けます。
|
20
|
+
を返します。このような `summarize(ary)` は、例えば以下のように書けます。
|
20
21
|
|
21
22
|
```javascript
|
22
23
|
const summarize = (ary) => {
|
1
テキスト修正
answer
CHANGED
@@ -44,6 +44,6 @@
|
|
44
44
|
|
45
45
|
以下は、上記を動作確認するために jsFiddle に上げたものです。
|
46
46
|
|
47
|
-
- **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/
|
47
|
+
- **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/5/](https://jsfiddle.net/jun68ykt/sfuvgxm5/5/)
|
48
48
|
|
49
49
|
以上、参考になれば幸いです。
|