我需要计算字符串中某个字符出现的次数。
例如,假设我的字符串包含:
var mainStr = "str1,str2,str3,str4";
我想求出逗号的个数,也就是3个字符。以及按逗号分隔后的单个字符串的计数,也就是4。
我还需要验证每个字符串,即str1或str2或str3或str4不应该超过,比如说,15个字符。
我需要计算字符串中某个字符出现的次数。
例如,假设我的字符串包含:
var mainStr = "str1,str2,str3,str4";
我想求出逗号的个数,也就是3个字符。以及按逗号分隔后的单个字符串的计数,也就是4。
我还需要验证每个字符串,即str1或str2或str3或str4不应该超过,比如说,15个字符。
当前回答
Leo Sauers回答中的第五种方法失败,如果字符位于字符串的开头。 如。
var needle ='A',
haystack = 'AbcAbcAbc';
haystack.split('').map( function(e,i){ if(e === needle) return i;} )
.filter(Boolean).length;
将给出2而不是3,因为过滤函数布尔为0给出false。
其他可能的过滤功能:
haystack.split('').map(function (e, i) {
if (e === needle) return i;
}).filter(function (item) {
return !isNaN(item);
}).length;
还有一个答案:
function count(string){
const count={}
string.split('').forEach(char=>{
count[char] = count[char] ? (count[char]+1) : 1;
})
return count
}
console.log(count("abfsdfsddsfdfdsfdsfdsfda"))
其他回答
我更新了这个答案。我更喜欢使用火柴的想法,但它更慢:
console.log((“str1,str2,str3,str4”.match(/,/g) ||[]).长度);日志 3 console.log((“str1,str2,str3,str4”.match(new RegExp(“str”, “g”)) ||[]).长度);日志 4
如果事先知道要搜索什么,可以使用正则表达式文字;如果不知道,可以使用RegExp构造函数,并传入g标志作为参数。
匹配结果为空,因此|| []
以下是我在2009年给出的原始答案。它创建了一个不必要的数组,但是使用分割更快(截至2014年9月)。我很矛盾,如果我真的需要速度,毫无疑问我会使用分拆,但我更喜欢使用匹配。
旧答案(2009年):
如果你在找逗号:
(mainStr.split(",").length - 1) //3
如果你在找str
(mainStr.split("str").length - 1) //4
在@Lo的回答和我自己的愚蠢的性能测试中,分裂在速度上领先,至少在Chrome中,但再次创建额外的数组似乎不理智。
好吧,另一个用regexp的——可能不快,但比其他的更短,可读性更好,在我的例子中只是用“_”来计数
key.replace(/[^_]/g,'').length
只要删除所有不像你的char的东西 但是用字符串作为输入看起来不太好
我正在做一个需要子字符串计数器的小项目。搜索错误的短语没有提供给我任何结果,然而在编写我自己的实现后,我偶然发现了这个问题。不管怎样,这是我的方法,它可能比这里的大多数慢,但可能对某些人有帮助:
function count_letters() {
var counter = 0;
for (var i = 0; i < input.length; i++) {
var index_of_sub = input.indexOf(input_letter, i);
if (index_of_sub > -1) {
counter++;
i = index_of_sub;
}
}
http://jsfiddle.net/5ZzHt/1/
请让我知道,如果你发现这个实现失败或不遵循一些标准!:)
更新 你可能想要替换:
for (var i = 0; i < input.length; i++) {
:
for (var i = 0, input_length = input.length; i < input_length; i++) {
上面讨论的内容很有趣: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
更新:这可能是简单的,但它不是最快的。参见下面的基准测试。
令人惊讶的是,13年了,这个答案还没有出现。从直觉上看,它应该是最快的:
const s = "The quick brown fox jumps over the lazy dog.";
const oCount = s.length - s.replaceAll('o', '').length;
如果字符串中只有两种字符,那么这样仍然更快:
const s = "001101001";
const oneCount = s.replaceAll('0', '').length;
基准
const { performance } = require('node:perf_hooks');
const ITERATIONS = 10000000;
const TEST_STRING = "The quick brown fox jumps over the lazy dog.";
console.log(ITERATIONS, "iterations");
let sum = 0; // make sure compiler doesn't optimize code out
let start = performance.now();
for (let i = 0; i < ITERATIONS; ++i) {
sum += TEST_STRING.length - TEST_STRING.replaceAll('o', '').length;
}
let end = performance.now();
console.log(" replaceAll duration", end - start, `(sum ${sum})`);
sum = 0;
start = performance.now();
for (let i = 0; i < ITERATIONS; ++i) {
sum += TEST_STRING.split('o').length - 1
}
end = performance.now();
console.log(" split duration", end - start, `(sum ${sum})`);
10000 iterations
replaceAll duration 2.6167500019073486 (sum 40000)
split duration 2.0777920186519623 (sum 40000)
100000 iterations
replaceAll duration 17.563208997249603 (sum 400000)
split duration 8.087624996900558 (sum 400000)
1000000 iterations
replaceAll duration 128.71587499976158 (sum 4000000)
split duration 64.15841698646545 (sum 4000000)
10000000 iterations
replaceAll duration 1223.3415840268135 (sum 40000000)
split duration 629.1629169881344 (sum 40000000)
如果您正在使用lodash,则_。countBy方法将执行以下操作:
_.countBy("abcda")['a'] //2
这个方法也适用于array:
_.countBy(['ab', 'cd', 'ab'])['ab'] //2