2017-07-30 104 views
3

我想要統計字符串中某個字符的出現次數。ES6/lodash計算字符串中某個字符的出現次數

這個堆棧溢出後做,使用ES5但不ES6或Lodash:

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

不過,我想知道是否有這樣做的更ES6方式。 Lodash解決方案也是可以接受的。

+0

不知道爲什麼你需要這麼具體的事情。有幾種方法可以使用正則表達式或使用字符串拆分和長度來執行此操作。 [這裏](HTTPS:// github上。com/lodash/lodash/issues/702)是一個請求這種功能的lodash線程,以及幾種替代方法。我想你可以使用'count = 0; for(let ch of string){if ch ===(target)count ++;}',但這似乎效率低下。同樣,你可以將整個字符串分解成一個數組,但我沒有看到它的重點。 –

+0

如果您的目標是速度,您將需要使用其中一種ES5解決方案。 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)

如果要求是隻算的

字符的出現

可以使用for..of循環與===&&++運營商

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的speficity在原始問題上缺乏從需求角度來看,在這裏。這種方法當然可以更簡潔地編寫。 – guest271314

+0

@ 4castle你的意思是_「在OP上的一個角色」_? – guest271314

1

單線ES6,使用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);

相關問題