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

回答編集履歴

18

テキスト修正

2019/08/09 15:28

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/09 15:28

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/08 23:21

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  こんにちは
2
2
 
3
- ご質問の理解として、 `result5` は以下のようなオブジェクトであると認識しました。
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
- この回答では、上記のオブジェクトである `result5` に対して集計処理を行って、
13
+ この回答では、上記のオブジェクト `result5` に含まれる配列に対して集計処理を行って、ご質問にある
14
14
 
15
- > 最終的には配列内のa,b,c,dは消し、以下の様な形にしたいです。
15
+ > 最終的には配列内のa,b,c,dは消し、以下の様な形
16
16
 
17
- と書かれている、望ましい内容を持つオブジェクトを、 `result6` という変数として得るためのコードを示します。
17
+ 内容を持つオブジェクトを、 `result6` という変数として得るためのコードを示します。
18
18
 
19
19
  まず、以下のような関数`summarize(ary)` を作成します。
20
20
 

15

テキスト修正

2019/08/08 23:13

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -59,7 +59,7 @@
59
59
 
60
60
  ### 追記
61
61
 
62
- 補足ですが、上記に挙げたコードの中で、以下の `result5` から `result6` を得る行
62
+ 補足ですが、上記に挙げたコードの中で、 `result5` から `result6` を得る以下の
63
63
  ```javascript
64
64
  const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
65
65
  ```

14

テキスト修正

2019/08/08 13:40

投稿

jun68ykt
jun68ykt

スコア9058

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)`を使うと、以下のオブジェクト `result5`
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

テキスト修正

2019/08/08 13:36

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/08 08:07

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  上記の `summarize(ary)`を使うと、以下のオブジェクト `result5`
31
31
  ```javascript
32
- let result5 = {
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
- result5 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
42
+ const result6 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
43
43
  ```
44
44
 
45
- 上記により、`result5` には望む内容のオブジェクトが入ります。
45
+ 上記により、`result6` には各配列が集計されているオブジェクトが入ります。
46
46
 
47
47
  以下は、上記を動作確認するために jsFiddle に上げたものです。
48
48
 
49
- - **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/5/](https://jsfiddle.net/jun68ykt/sfuvgxm5/5/)
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
- result5 = Object.entries(result5).reduce((obj, [k,v]) => ({...obj, [k]: summarize(v)}), {});
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
- result5 = _.mapValues(result5, summarize);
61
+ const result6 = _.mapValues(result5, summarize);
62
62
  ```
63
- - **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/2/](https://jsfiddle.net/jun68ykt/3tounhgL/2/)
63
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/3tounhgL/3/](https://jsfiddle.net/jun68ykt/3tounhgL/3/)
64
64
 
65
65
  [lodash](https://lodash.com/) はオブジェクトや配列の操作で便利なメソッドを提供しており、用途にうまく合ったメソッドがみつかると、コードを短くできることがあります。

11

テキスト修正

2019/08/08 08:04

投稿

jun68ykt
jun68ykt

スコア9058

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
- については、オブジェクトや配列の操作で便利なメソッドを提供している lodash の [_.mapValues](https://lodash.com/docs/4.17.15#mapValues) を使うと、以下のように少し短く書けます。
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

テキスト修正

2019/08/08 07:04

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/08 06:51

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -21,7 +21,7 @@
21
21
  ```javascript
22
22
  [['y', 100, 'c'], ['y', 10, 'c'], ['x', 1, 'c']]
23
23
  ```
24
- が与えられた場合は、足し上げたうえで、 `'x'`, `'y'` の順に並び替えて、
24
+ が与えられた場合は、足し上げたうえで、 先頭要素アルファベット順に並び替えて、
25
25
  ```javascript
26
26
  [['x', 1], ['y', 110]]
27
27
  ```

8

テキスト修正

2019/08/08 06:28

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -27,7 +27,7 @@
27
27
  ```
28
28
  を返します。
29
29
 
30
- 上記の `summarize(ary)`を使うと、以下の変数 `result5`
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

テキスト修正

2019/08/08 06:28

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/08 06:21

投稿

jun68ykt
jun68ykt

スコア9058

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
  ```
@@ -21,7 +21,7 @@
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
  ```

5

テキスト修正

2019/08/08 06:10

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/08 05:21

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,8 +1,16 @@
1
1
  こんにちは
2
2
 
3
3
  まず、以下のような関数`summarize(ary)` を作成します。
4
- 関数`summarize(ary)`は、引数 `ary` に
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
- を返します。このような `summarize(ary)` は、いろいろな書き方が出来そうです。一例として、以下のように書けます。
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

テキスト修正

2019/08/08 05:13

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/08/08 04:15

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,14 +1,15 @@
1
1
  こんにちは
2
2
 
3
- まず、以下のような関数`summarize(ary)` を作成します。引数 `ary` に
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
- が与えられたら、`summarize(ary)` は
8
+ が与えられたら、
8
9
  ```javascript
9
10
  [['x', 2000], ['y', 1001]]
10
11
  ```
11
- を返し引数 `ary` に
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

テキスト修正

2019/08/08 04:04

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -44,6 +44,6 @@
44
44
 
45
45
  以下は、上記を動作確認するために jsFiddle に上げたものです。
46
46
 
47
- - **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/4/](https://jsfiddle.net/jun68ykt/sfuvgxm5/4/)
47
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/sfuvgxm5/5/](https://jsfiddle.net/jun68ykt/sfuvgxm5/5/)
48
48
 
49
49
  以上、参考になれば幸いです。