質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

4回答

2053閲覧

Javascriptで指定文字列の中にある文字がどのくらい含まれるか割合を取得する

rishi

総合スコア14

JavaScript

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

0グッド

0クリップ

投稿2017/04/22 11:44

Javascriptで指定した文字列の中にある文字がその文字列で何パーセント含まれるかを出力したいのですが何か良い方法はないでしょうか?

javascript

1 2() 3var str = "aaaabbbbccccddddeeee" 4 5a : 20% 6b : 20% 7c : 20% 8d : 20% 9e : 20% 10 11//上記のような結果にしたいです 12

どなたかご教授の方お願いします。

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

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

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

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

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

guest

回答4

0

書きましたが、まずは自分でコードを考えて書いてみる事が大切だと思います。

JavaScript

1var string = 'aaaabbbbccccddddeeee'; 2console.log(string.match(/a/g).length / string.length * 100 + '%'); // 20%

質問では方法を尋ねていますが、方法の回答を貰ったらあなたは自分でコードを書けますか?
書けるのなら自分で分かっている範囲だけでもコードを書いて、分からない箇所を具体的に書きましょう。

Re: hatsuhatsu さん

投稿2017/04/22 11:54

編集2017/04/22 12:01
think49

総合スコア18166

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

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

rishi

2017/04/22 12:06

ご指摘されたように自分で試した結果を書いた上で質問をするのが鉄則だと思いました。 申し訳ありません、もう一度出直します。
think49

2017/04/23 02:50

親記事のコードでは任意の文字列から全ての文字種の割合を調べるコードになってないので、そこを修正する方法を考えてみるのも良いかもしれません。 任意の文字を対象にするなら new RegExp を併用する必要がありますが、そうなると正規表現メタキャラクタをエスケープする処理が必要になります。 文字列の先頭から末尾までの走査は ES3 なら charAt, ES5 なら string[i] なら ES6 なら for-of 他の皆さんは配列化して処理するコードを書いてらっしゃいますが、書き方は人それぞれなのでいろいろと書いてみると良いと思います。 私は古い人間なのでパフォーマンス優先で「文字列の先頭から末尾までの走査を1回だけに抑えること」を考えてしまいます。 書いておいてなんですが、String#match は使った数だけ走査回数を増やしている点がパフォーマンスの観点でいえば、本案件には向いていません。 走査回数を1回に抑える為には、先頭から順に捜査して値比較して出現回数をカウントしていくコードが必要になります。
rishi

2017/04/23 12:28

think49さんのコードを参考に自分で考えた結果new RegExpを用いて出力するようにしました。 複数の方法、パフォーマンスについてまで丁寧に教えてくださってありがとうございます。 本当に感謝致します。
guest

0

js

1const str = "dbbcccceddeaadbaabee"; 2const res = str 3 .split("") 4 .sort() 5 .join("") 6 .match(/(.)\1*/g) 7 .reduce((map, x)=> map.set(x[0], x.length), new Map()); 8 9for(const [char, length] of res.entries()){ 10 console.log(`${char}: ${(length/str.length)*100}%`); 11}

※サロゲートペアが絡んでくると話が変わってきます。そういう文字が含まれない想定で実装をしています。

投稿2017/04/22 14:48

編集2017/10/25 13:45
gaogao_9

総合スコア103

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

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

0

JavaScript

1let str_array = "dbbcccceddeaadbaabee".split( '' ).sort(); 2const count = str_array.length; 3let res = str_array.reduce( function( prev, curr, i, arr ) { 4 if ( !prev[ curr ] ) { prev[ curr ] = 0; } 5 prev[ curr ]++; 6 return prev; 7}, {} ); 8console.log( Object.keys( res ) ); 9 10Object.keys( res ).forEach( function( key ) { 11 console.log( key, res[ key ] / count * 100 + '%' ); 12} ); 13```**動くサンプル:**[https://jsfiddle.net/mcf40mLt/](https://jsfiddle.net/mcf40mLt/)

投稿2017/04/22 12:18

kei344

総合スコア69416

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

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

0

自己解決

js

1var str = "Hey are you"; 2var strNew = str.replace(/\s+/g, ""); 3var strNum = strNew.length; 4var m = new Map(); 5 6for(var i = 0; i < strNew.length; i++){ 7 var val = strNew[i]; 8 regexp = new RegExp(val + '(.*?)', 'g'); 9 m.set(val, Math.floor((strNew.match(regexp).length / strNum) *100) + "%") 10 11} 12console.log(m);//下記のような結果を出力することができました 13 14Map { 15 'H' => '11%', 16 'e' => '22%', 17 'y' => '22%', 18 'a' => '11%', 19 'r' => '11%', 20 'o' => '11%', 21 'u' => '11%' 22}

投稿2017/04/23 12:22

rishi

総合スコア14

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

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

think49

2017/04/23 13:39

正規表現メタキャラクタをエスケープしていない為、var str = "\\"; で SyntaxError になります。 同じ文字種に対して何度も m.set() が実行される為、パフォーマンスの観点でも改善の余地があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問