ES6 / lodash 统计字符串中某个字符出现的次数

Posted

技术标签:

【中文标题】ES6 / lodash 统计字符串中某个字符出现的次数【英文标题】:ES6 / lodash count the number of occurrences of a character in a string 【发布时间】:2018-01-06 09:25:03 【问题描述】:

我想统计一个字符在字符串中出现的次数。

这个堆栈溢出帖子使用 ES5 而不是 ES6 或 Lodash:

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

但是,我想知道是否有更多的 ES6 方式来执行此操作。 Lodash 解决方案也是可以接受的。

【问题讨论】:

不知道你为什么需要这么具体的东西。有几种方法可以做到这一点,使用正则表达式,或使用字符串拆分和长度。 Here 是一个请求此功能的 lodash 线程,以及几种替代方法。我猜你可以使用count=0;for (let ch of string) if ch === (target) count++; 之类的东西,但这似乎效率低下。同样,您可以将整个字符串分解成一个数组,但我看不出它的意义。 如果您的目标是速度,您会想要使用其中一种 ES5 解决方案。 ES6 技巧一般都是基于函数式编程的,所以开销更大。 这与linked question 完全相同(它也提供 Lodash 解决方案)。 ES6 中没有任何东西可以改进现有 ES5 的解决方案。 【参考方案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);

【讨论】:

我不确定这是他们想要的输出。此外,生成频率图通常是一个 O(n) 算法,但通过在每次迭代中运行整个匹配,您已经使其成为 O(n^2)。 @4castle 仍然需要深入研究时间复杂度算法,今天阅读一些,尽管还会阅读更多内容。除了字符串中每个字符的出现次数外,OP 没有指定预期的输出。您认为预期的输出是什么?由于从角度来看,原始问题缺乏 OP 的特殊性,因此在这里。该方法当然可以更简洁地组合 @4castle 你是说OP里的“一个角色”吗? 对。我不确定他们是否只想计算单个特定字符的出现次数,或者是否想计算字符串中每个字符的出现次数。无论哪种方式,算法都应该只需要遍历字符串一次。【参考方案2】:

单行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);

【讨论】:

【参考方案4】:

这是一个 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>

【讨论】:

以上是关于ES6 / lodash 统计字符串中某个字符出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

统计文件里面某个字符串出现次数

面试题总结1统计字符串中某个单词出现的次数

shell统计某个字符串最后一次出现的位置之前的所有字符串

shell统计某个字符串最后一次出现的位置之前的所有字符串

C语言,输入一个字符串,统计重复出现某个字母的次数。

python如何在给定的字符串中,统计某个特定子串的数量?