2017-07-30 28 views
3

文字列内の文字の出現回数をカウントします。ES6/lodashは文字列内の文字の出現回数をカウントします。

Count the number of occurrences of a character in a string in Javascript

は、しかし、私はこれを行うためのよりES6方法があるかどうかを知りたい:

このスタックオーバーフローポストはES5を使用してではなく、ES6またはLodashことを行います。 Lodashソリューションも受け入れられます。

+0

そんなに特定の何かを必要とする理由わかりません。これを行うには、正規表現を使用する方法と、文字列分割と長さを使用する方法があります。 [Here](https:// github。com/lodash/lodash/issues/702)は、このfuncitonalityを要求するlodashスレッドです。私は 'count = 0; for(文字列のch){ch ===(目標)count ++;}'のようなものを使うことができると思うが、それは非効率的だ。同様に、文字列全体を配列に分割することもできますが、その点はわかりません。 –

+0

あなたの目標がスピードであれば、それらのES5ソリューションの1つを使用したいと思うでしょう。 ES6のトリックは一般に関数型プログラミングに基づいているため、オーバーヘッドが増えます。 – 4castle

+1

これは[リンクされた質問]の正確な複製です(https://stackoverflow.com/questions/881085/count-the-number-of-occurrences-of-a-character-in-a-string-in-javascript)( Lodashのソリューションも提供しています)。 ES6には、既存のES5ソリューションを改善するものは何もありません。 – estus

答えて

8

そして、ここにいlodashソリューション:

const count = (str, ch) => _.countBy(str)[ch] || 0; 
 

 
console.log(count("abcadea", "a"));
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

ソリューションは、コンパクトに見えますが、正規表現を使用し、まだ独身で仕事をしていませんスキャン。パフォーマンスが本当に重要なのであれば、それはかなり速くなければならないが、良い古いforループを選ぶ方がよい。

更新:別lodashベースのソリューション:

const count = (str, ch) => _.sumBy(str, x => x === ch) 
 

 
console.log(count("abcadea", "a"));
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

1

要件のみにある場合は、

文字

の発生をカウント Array.from()RegExpコンストラクタと String.prototype.match()

const str = "abcabc"; 
 

 
const occurences = Array.from(str, (s, index) => 
 
        ({[s]:str.match(new RegExp(s, "g")).length, index})); 
 

 
console.log(occurences)

を使用することができます

あなたが===&&++事業者と

const [str, char] = ["abc abc", " "]; 
 

 
let occurrences = 0; 
 

 
for (const s of str) s === char && ++occurrences; // match space character 
 

 
console.log(occurrences);

+2

私はこれが彼らが望む出力であるかどうかはわかりません。また、頻度マップを生成するのは通常O(n)アルゴリズムですが、すべての繰り返しで一致全体を実行することでO(n^2)にしています。 – 4castle

+0

@ 4castleまだ時間の複雑さのアルゴリズムに没頭しなければなりません。 OPは、期待される出力が文字列内の各文字の出現数以外のものを指定しません。あなたは期待される成果として何を認識していますか?視点からの要件については、元の質問でOPからの曖昧さが欠けているので、ここで。アプローチは確かにより簡潔に構成することができます – guest271314

+0

@ 4castleあなたはOPで_ "a character" _を意味しますか? – guest271314

1

シングルラインES6をfor..ofループを使用することができ、私はそれがだとは思わないString.prototype.match()

const count = (str, ch) => str.match(new RegExp(ch, 'g')).length; 
 

 
console.log(count('abcdefgaaa', 'a'));

3

使用していますより良い RegExpソリューションですが、ES6です。

文字列を配列に展開し、結果をフィルタリングして、必要な文字のみを取得します。結果の配列の長さは、その文字の出現数です。

const str = "aabbccaaaaaaaccc"; 
 

 
const result = [...str].filter(l => l === 'c').length; 
 

 
console.log(result);

関連する問題