🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

5回答

4434閲覧

JavaScript配列内で最も多い要素を抽出したい

sbhduriopk

総合スコア4

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

4クリップ

投稿2020/01/11 08:52

js

1const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"];

上の場合は配列内で最も多い「e」が出力されるようにしたいです。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/11 09:07

まず思うように組んでみてください。 まさか「何もしてない」わけではないでしょうし。 質問するからには何かしらやってみて想定通りの動作にならなくて困って質問しているはずです。 が、書かないとそういうことも伝わらないので、きちんと書いてください。
kei344

2020/01/11 10:33

過去の質問について、全て「解決済」になっていません。解決したものは「ベストアンサー」を選び、自力で解決した場合はその方法を解答欄に書き、もし万が一解決していないのであれば質問を編集するなどしてみてください。
guest

回答5

0

ループ回数をN回にして、最速で求めたい。
出現回数最大の要素が複数存在するかもしれないので、new Set で返したい。

JavaScript

1'use strict'; 2const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d", "f", "f", "f"]; 3const s = (a,i,v) => (a[i]?a[i].add(v):a[i]=new Set(v),i); 4const c = array.reduce(function (a,v) {return (this.set(v, s(a,(this.get(v)+1||1),v)),a);}.bind(new Map), []).pop(); 5 6console.log([...c]); // ["e", "f"]

(※真の最速は while 一択ですが…)

Re: sbhduriopk さん

投稿2020/01/11 10:37

think49

総合スコア18189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2020/01/11 13:35 編集

回答が付いたら、修正依頼が流されるのは目に見えているので、せっかく書いたコードが勿体無くて投下するというよくある光景。
guest

0

大喜利ですね?

JavaScript

1const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 2console.log([...array.sort().join("").matchAll(/(.)\1+/g)].map(a => a[0]).sort((a, b) => b.length - a.length)[0][0]);

投稿2020/01/11 13:42

編集2020/01/11 14:01
Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

回答するにあたって、

  • 「配列から最頻出の要素を見つけ出す」という汎用的なコードは、既にどこかで作られていると思われるので、これをいかにして自作しないで済ませられるか?

という方針で考えました。ご質問の本題は、統計用語の最頻値(モード) を求めることですので、何らかの統計ライブラリを使えば良さそうです。探してみると、 jStat のメソッド mode() が見つかります。これを使って、一文字の文字列を要素とする配列 charAry を受け取り、最頻出の要素の配列を返す関数

  • modeOfChars(charAry) 

を作成しました。

javascript

1const modeOfChars = (charAry = []) => { 2 if (!charAry.length) return []; 3 4 const intAry = charAry.map(ch => ch.charCodeAt(0)); 5 const mode = jStat.mode(intAry); 6 7 return mode.length ? mode.map(String.fromCharCode) : [String.fromCharCode(mode)]; 8} 9 10 11// 以下、実行例 12console.log(modeOfChars(["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"])); // => ["e"] 13console.log(modeOfChars(["a", "b", "c", "d", "e", "e", "b", "e", "c", "b", "d"])); // => ["b", "e"] 14console.log(modeOfChars([])); // => [] 15console.log(modeOfChars()); // => []

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

投稿2020/01/11 12:54

編集2020/01/11 18:28
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

好きに使って下さい。考え方次第ではこんな無駄な恥ずかしいコードでも動きます。
あなたがやっていることは考えることすらしてないように見えます。自分のソースを出しましょう。
※出現頻度を調べたい対象が非数字、かつ一文字だから動くしょぼい実装です。

js

1function RunLength(str) { 2 var output = ''; 3 while (str.length > 0) { 4 var current = new RegExp(str[0] + '+'); 5 var length = str.match(current).toString().split('').length; 6 output += length.toString() + str.match(current)[0][0] + ","; 7 str = str.replace(str.match(current)[0], ''); 8 } 9 10 return output; 11} 12 13function compare(a, b) { 14 a = Number( a.match(/\d*/)[0]); 15 b = Number( b.match(/\d*/)[0]); 16 if (a < b) { 17 return 1; 18 } 19 if (a > b) { 20 return -1; 21 } 22 return 0; 23} 24 25//const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 26const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d","a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 27 28 29console.log(RunLength(array.sort().join("")).split(/,/).sort(compare)[0].match(/\d*/)[0]); 30

投稿2020/01/11 10:36

編集2020/01/11 12:02
oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Ramda を使って実装したい。

JavaScript

1import {countBy, head, identity, last, maxBy, reduce, toPairs} from "//cdn.jsdelivr.net/npm/ramda@0.26.1/es/index.js"; 2const manyEntry = (arr) => head(reduce(maxBy(last))([undefined, 0])(toPairs(countBy(identity)(arr)))); 3const array = ["a", "b", "c", "d", "e", "e", "b", "e", "c", "a", "d"]; 4console.log(manyEntry(array));

JS Binでの実行結果

投稿2020/01/11 09:43

編集2020/01/11 10:41
raccy

総合スコア21737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問