回答編集履歴

21

テキスト修正

2020/01/11 18:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,15 @@
2
2
 
3
3
 
4
4
 
5
- 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点から考えました。ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) があります。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
5
+ 回答するにあたって、
6
+
7
+
8
+
9
+ - 「配列から最頻出の要素を見つけ出す」という汎用的なコードは、既にどこかで作られていると思われるので、これを**いかにして自作しないで済ませられるか?**
10
+
11
+
12
+
13
+ という方針で考えました。ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) が見つかります。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
6
14
 
7
15
  - `modeOfChars(charAry)` 
8
16
 

20

テキスト修正

2020/01/11 18:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点から考えま。ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) がありましたので、これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
5
+ 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点から考えました。ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) があります。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
6
6
 
7
7
  - `modeOfChars(charAry)` 
8
8
 
9
9
 
10
10
 
11
- を作成しました。以下、そのコードです。
11
+ を作成しました。
12
12
 
13
13
  ```javascript
14
14
 

19

テキスト修正

2020/01/11 18:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点考えてみると、ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) がありましたので、これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
5
+ 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点から考えます。ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) がありましたので、これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
6
6
 
7
7
  - `modeOfChars(charAry)` 
8
8
 

18

テキスト修正

2020/01/11 18:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点で考えてみると、ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用すること思いつきす。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
5
+ 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点で考えてみると、ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) がありしたので、これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
6
6
 
7
7
  - `modeOfChars(charAry)` 
8
8
 

17

テキスト修正

2020/01/11 18:05

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、いかにして自作しないで済ませるか?という観点で考えてみると、ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用することが思いつきます。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
5
+ 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という観点で考えてみると、ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用することが思いつきます。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
6
6
 
7
7
  - `modeOfChars(charAry)` 
8
8
 

16

テキスト修正

2020/01/11 17:59

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,11 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- ご質問に回答するにあたって、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という方針検討しした
6
-
7
-
8
-
9
- ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用します。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
5
+ 回答するにあたって、[怠慢](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)な方針で検討しました。すなわち、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、いかにして自作しないで済ませるか?という観点考えてみると、ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用することが思いつきこれを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
10
6
 
11
7
  - `modeOfChars(charAry)` 
12
8
 

15

テキスト修正

2020/01/11 17:56

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,68 +1,18 @@
1
1
  こんにちは。
2
-
3
- [lodash](https://lodash.com/) を使いました。
4
2
 
5
3
 
6
4
 
7
- ```javascript
8
-
9
- const mostFrequentStr = _.maxBy(_.toPairs(_.countBy(array)), ([str, count]) => count).shift();
5
+ ご質問に回答するにあたって、「配列から最頻出の要素を見つけ出す」という汎用的なロジックを、**いかにして自作しないで済ませるか?**という方針で検討しました。
10
6
 
11
7
 
12
8
 
13
- ```
14
-
15
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/eYmrybj?editors=0012](https://codepen.io/jun68ykt/pen/eYmrybj?editors=0012)
16
-
17
-
18
-
19
- ### 追記1
20
-
21
-
22
-
23
- 上記と同じく、lodashを使いますが、最頻出の要素が複数ある場合に、それらを配列にして返すようにしました。
24
-
25
-
26
-
27
- ```javascript
28
-
29
- const counters = _.groupBy(_.toPairs(_.countBy(array)), ([str, count]) => count);
30
-
31
-
32
-
33
- const maxFrequency = Math.max(...Object.keys(counters));
34
-
35
-
36
-
37
- const mostFrequentStrs = counters[maxFrequency].map(([str, _]) => str);
38
-
39
- ```
40
-
41
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/oNgdEXg?editors=0012](https://codepen.io/jun68ykt/pen/oNgdEXg?editors=0012)
42
-
43
-
44
-
45
- ### 追記2
46
-
47
-
48
-
49
- もうひとつ別解を挙げます。
50
-
51
-
52
-
53
- ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用します。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
9
+ ご質問の本題は、統計用語の[最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用します。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
54
10
 
55
11
  - `modeOfChars(charAry)` 
56
12
 
57
13
 
58
14
 
59
15
  を作成しました。以下、そのコードです。
60
-
61
-
62
-
63
-
64
-
65
-
66
16
 
67
17
  ```javascript
68
18
 

14

テキスト修正

2020/01/11 17:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -104,4 +104,4 @@
104
104
 
105
105
 
106
106
 
107
- jStatを使うために、所与の文字列の配列を数値の配列に変換する必要がありますので、上記の `modeOfChars(charAry)` では、所与の配列`charAry` の要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列`intAry`を得て、それに対してモードを取得し、再度、一文字の文字列に戻すようにします
107
+ jStatを使うために、所与の文字列の配列を数値の配列に変換する必要がありますので、上記の `modeOfChars(charAry)` では、所与の配列`charAry` の要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列`intAry`を得て、それに対してモードを取得し、再度、一文字の文字列に戻しています

13

テキスト修正

2020/01/11 17:13

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -56,11 +56,11 @@
56
56
 
57
57
 
58
58
 
59
- を作成します。
59
+ を作成しました。以下、そのコードです。
60
60
 
61
61
 
62
62
 
63
- jStatを使うために、所与の文字列の配列を数値の配列に変換する必要がありますので、所与の配列要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列を得て、それに対してモードを取得し、再度、一文字の文字列に戻すようにします。以下、関数`modeOfChars` のコードです。
63
+
64
64
 
65
65
 
66
66
 
@@ -99,3 +99,9 @@
99
99
  ```
100
100
 
101
101
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012](https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012)
102
+
103
+
104
+
105
+
106
+
107
+ jStatを使うために、所与の文字列の配列を数値の配列に変換する必要がありますので、上記の `modeOfChars(charAry)` では、所与の配列`charAry` の要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列`intAry`を得て、それに対してモードを取得し、再度、一文字の文字列に戻すようにします

12

テキスト修正

2020/01/11 17:12

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -82,6 +82,20 @@
82
82
 
83
83
  }
84
84
 
85
+
86
+
87
+
88
+
89
+ // 以下、実行例
90
+
91
+ console.log(modeOfChars(["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"])); // => ["e"]
92
+
93
+ console.log(modeOfChars(["a", "b", "c", "d", "e", "e", "b", "e", "c", "b", "d"])); // => ["b", "e"]
94
+
95
+ console.log(modeOfChars([])); // => []
96
+
97
+ console.log(modeOfChars()); // => []
98
+
85
99
  ```
86
100
 
87
101
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012](https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012)

11

テキスト修正

2020/01/11 16:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って、引数として、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
53
+ ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を利用します。これを使って、一文字の文字列を要素とする配列 `charAry` を受け取り、最頻出の要素の配列を返す関数
54
54
 
55
55
  - `modeOfChars(charAry)` 
56
56
 

10

テキスト修正

2020/01/11 16:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,17 @@
50
50
 
51
51
 
52
52
 
53
- ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得るこができます。ただjStatを使うために所与の文字列配列を数値の配列に変換する必要があますので所与配列要素がアルファベット一文字であることを前提として、各文字ASCIIコードの配列を得て、それに対してモードを取得し、再度、一文字の文字列に戻しま
53
+ ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って、引数とし一文字の文字列を要素とする配列 `charAry` 受け取り、最頻出の要素の配列を関数
54
+
55
+ - `modeOfChars(charAry)` 
56
+
57
+
58
+
59
+ を作成します。
60
+
61
+
62
+
63
+ jStatを使うために、所与の文字列の配列を数値の配列に変換する必要がありますので、所与の配列要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列を得て、それに対してモードを取得し、再度、一文字の文字列に戻すようにします。以下、関数`modeOfChars` のコードです。
54
64
 
55
65
 
56
66
 

9

テキスト修正

2020/01/11 16:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- 上記と同じく、lodashを使いますが、最頻出の要素が複数あり得る場合に、それらを配列にして返すようにしました。
23
+ 上記と同じく、lodashを使いますが、最頻出の要素が複数ある場合に、それらを配列にして返すようにしました。
24
24
 
25
25
 
26
26
 

8

テキスト修正

2020/01/11 16:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -56,7 +56,11 @@
56
56
 
57
57
  ```javascript
58
58
 
59
- const modeOf = (charAry) => {
59
+ const modeOfChars = (charAry = []) => {
60
+
61
+ if (!charAry.length) return [];
62
+
63
+
60
64
 
61
65
  const intAry = charAry.map(ch => ch.charCodeAt(0));
62
66
 
@@ -68,18 +72,6 @@
68
72
 
69
73
  }
70
74
 
71
-
72
-
73
-
74
-
75
- console.log(modeOf(["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"])); // => ["e"]
76
-
77
-
78
-
79
- console.log(modeOf(["a", "b", "c", "d", "e", "e", "b", "e", "c", "b", "d"])); // => ["b, e"]
80
-
81
-
82
-
83
75
  ```
84
76
 
85
77
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012](https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012)

7

テキスト修正

2020/01/11 16:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,21 +50,21 @@
50
50
 
51
51
 
52
52
 
53
- ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を数の配列に変換してからモードを取得し、再度文字列に戻します。
53
+ ご質問の本題を統計用語でいうと、 [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。ただしjStatを使うために、所与の文字列の配列を数の配列に変換する必要がありますので、所与の配列要素がアルファベット一文字であることを前提として、各文字のASCIIコードの配列を得て、それに対してモードを取得し、再度、一文字の文字列に戻します。
54
54
 
55
55
 
56
56
 
57
57
  ```javascript
58
58
 
59
- const modeOf = (strAry) => {
59
+ const modeOf = (charAry) => {
60
60
 
61
- const intAry = strAry.map((str, _, self) => self.findIndex(e => e === str));
61
+ const intAry = charAry.map(ch => ch.charCodeAt(0));
62
62
 
63
63
  const mode = jStat.mode(intAry);
64
64
 
65
65
 
66
66
 
67
- return mode.length ? mode.map(i => strAry[i]) : [strAry[mode]];
67
+ return mode.length ? mode.map(String.fromCharCode) : [String.fromCharCode(mode)];
68
68
 
69
69
  }
70
70
 
@@ -82,4 +82,4 @@
82
82
 
83
83
  ```
84
84
 
85
- - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/BayxYwJ?editors=0012](https://codepen.io/jun68ykt/pen/BayxYwJ?editors=0012)
85
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012](https://codepen.io/jun68ykt/pen/eYmrMXW?editors=0012)

6

テキスト修正

2020/01/11 16:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- 最頻出の要素が複数あり得る場合に、それらを配列にして返すようにしたコードが以下です
23
+ 上記と同じく、lodashを使いますが、最頻出の要素が複数あり得る場合に、それらを配列にして返すようにしました。
24
24
 
25
25
 
26
26
 

5

テキスト修正

2020/01/11 15:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- ご質問の本題は、統計的にいうと [最頻値(mode)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を整数の配列に変換してからモードを取得し、再度文字列に戻します。
53
+ ご質問の本題統計用語でいうと [最頻値(モード)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を整数の配列に変換してからモードを取得し、再度文字列に戻します。
54
54
 
55
55
 
56
56
 

4

テキスト修正

2020/01/11 15:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- ご質問の本題は、統計的にいうと [最頻値(mode)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を数の配列に変換してからモードを取得し、再度文字列に戻します。
53
+ ご質問の本題は、統計的にいうと [最頻値(mode)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を数の配列に変換してからモードを取得し、再度文字列に戻します。
54
54
 
55
55
 
56
56
 
@@ -58,9 +58,9 @@
58
58
 
59
59
  const modeOf = (strAry) => {
60
60
 
61
- const indexAry = strAry.map((str, _, self) => self.findIndex(e => e === str));
61
+ const intAry = strAry.map((str, _, self) => self.findIndex(e => e === str));
62
62
 
63
- const mode = jStat.mode(indexAry);
63
+ const mode = jStat.mode(intAry);
64
64
 
65
65
 
66
66
 

3

テキスト修正

2020/01/11 15:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- ご質問の本題は、統計的にいうと[最頻値(mode)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることです。ですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を数値の配列に変換してからモードを取得し、再度文字列に戻します。
53
+ ご質問の本題は、統計的にいうと [最頻値(mode)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を数値の配列に変換してからモードを取得し、再度文字列に戻します。
54
54
 
55
55
 
56
56
 

2

テキスト修正

2020/01/11 15:00

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- ### 追記
19
+ ### 追記1
20
20
 
21
21
 
22
22
 
@@ -39,3 +39,47 @@
39
39
  ```
40
40
 
41
41
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/oNgdEXg?editors=0012](https://codepen.io/jun68ykt/pen/oNgdEXg?editors=0012)
42
+
43
+
44
+
45
+ ### 追記2
46
+
47
+
48
+
49
+ もうひとつ別解を挙げます。
50
+
51
+
52
+
53
+ ご質問の本題は、統計的にいうと、[最頻値(mode)](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%A0%BB%E5%80%A4) を求めることです。ですので、統計ライブラリ [jStat](https://github.com/jstat/jstat) のメソッド [mode()](https://jstat.github.io/all.html#mode) を使って得ることができます。jStatを使うために、所与の文字列の配列を数値の配列に変換してからモードを取得し、再度文字列に戻します。
54
+
55
+
56
+
57
+ ```javascript
58
+
59
+ const modeOf = (strAry) => {
60
+
61
+ const indexAry = strAry.map((str, _, self) => self.findIndex(e => e === str));
62
+
63
+ const mode = jStat.mode(indexAry);
64
+
65
+
66
+
67
+ return mode.length ? mode.map(i => strAry[i]) : [strAry[mode]];
68
+
69
+ }
70
+
71
+
72
+
73
+
74
+
75
+ console.log(modeOf(["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"])); // => ["e"]
76
+
77
+
78
+
79
+ console.log(modeOf(["a", "b", "c", "d", "e", "e", "b", "e", "c", "b", "d"])); // => ["b, e"]
80
+
81
+
82
+
83
+ ```
84
+
85
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/BayxYwJ?editors=0012](https://codepen.io/jun68ykt/pen/BayxYwJ?editors=0012)

1

テキスト修正

2020/01/11 14:47

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -13,3 +13,29 @@
13
13
  ```
14
14
 
15
15
  - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/eYmrybj?editors=0012](https://codepen.io/jun68ykt/pen/eYmrybj?editors=0012)
16
+
17
+
18
+
19
+ ### 追記
20
+
21
+
22
+
23
+ 最頻出の要素が複数あり得る場合に、それらを配列にして返すようにしたコードが以下です。
24
+
25
+
26
+
27
+ ```javascript
28
+
29
+ const counters = _.groupBy(_.toPairs(_.countBy(array)), ([str, count]) => count);
30
+
31
+
32
+
33
+ const maxFrequency = Math.max(...Object.keys(counters));
34
+
35
+
36
+
37
+ const mostFrequentStrs = counters[maxFrequency].map(([str, _]) => str);
38
+
39
+ ```
40
+
41
+ - **動作確認用CodePen:** [https://codepen.io/jun68ykt/pen/oNgdEXg?editors=0012](https://codepen.io/jun68ykt/pen/oNgdEXg?editors=0012)