2017-07-30 220 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);

相关问题