在Javascript中统计字符串中字符出现的次数

785
我需要统计一个字符串中某个字符出现的次数。
例如,假设我的���符串包含:
var mainStr = "str1,str2,str3,str4";

我想要找到逗号 , 字符的数量,它是3。以及在逗号分割后的单个字符串的数量,这是4。

我还需要验证每个字符串即str1或str2或str3或str4都不应超过15个字符。


根据下面排名最高的答案,你也可以使用这个在线工具来交叉检查结果:https://magictools.dev/#!/tools/character-occurences - WJA
39个回答

0
该函数以字符串 str 作为参数,并计算字符串中每个唯一字符的出现次数。结果为每个字符提供一个键 - 值对。
var charFoundMap = {};//object defined
    for (var i = 0; i < str.length; i++) {

       if(!charFoundMap[ str[i] ])  {
        charFoundMap[ str[i] ]=1;
       } 
       else
       charFoundMap[ str[i] ] +=1;
       //if object does not contain this 
    }
    return charFoundMap;

} 

你忘记了问题的第二部分:“我还需要验证每个字符串,例如str1或str2或str3或str4,不应超过15个字符。” - Maxime Launois

0
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"))

0

我的解决方案:

function countOcurrences(str, value){
   var regExp = new RegExp(value, "gi");
   return str.match(regExp) ? str.match(regExp).length : 0;  
}

这段代码不会起作用,因为String.prototype.match在没有匹配的情况下返回null。这意味着没有引用一个带有length属性的对象。换句话说:String.prototype.match.call('willnotwork', /yesitwill/) === null - Lorenz Lo Sauer

0

有一种非常棘手的方法,但它是相反的:

const sampleStringText = "/john/dashboard/language";

假设以上示例,要计算正斜杠数量,您可以这样做:
console.log( sampleStringText.split('/') - 1 );

所以我建议使用一个函数来实现它(TypeScript):

const counter = (sentence: string, char: string): number => sentence.split(char) - 1;

0

我知道这可能是一个老问题,但我对于JavaScript低级入门者有一个简单的解决方案。

作为一个初学者,我只能理解这个问题的一些解决方案,因此我使用了两个嵌套的 FOR 循环来检查字符串中的每个字符是否与其他字符相等,并递增一个计数变量以表示找到的每个等于该字符的字符。

我创建了一个新的空对象,其中每个属性键是一个字符,值是该字符串中每个字符出现的次数(count)。

示例函数:

function countAllCharacters(str) {
  var obj = {};
  if(str.length!==0){
    for(i=0;i<str.length;i++){
      var count = 0;
      for(j=0;j<str.length;j++){
        if(str[i] === str[j]){
          count++;
        }
      }
      if(!obj.hasOwnProperty(str[i])){
        obj[str[i]] = count;
      }
    }
  }
  return obj;
}

0

我的解决方案是使用Ramda JS:

const testString = 'somestringtotest'

const countLetters = R.compose(
  R.map(R.length),
  R.groupBy(R.identity),
  R.split('')
)

countLetters(testString)

链接到REPL。


0
let str = "aabgrhaab"
let charMap = {}

for(let char of text) {
   if(charMap.hasOwnProperty(char)){
      charMap[char]++
   } else {
     charMap[char] = 1
   }
}

console.log(charMap); //{a: 4, b: 2, g: 1, r: 1, h: 1}

控制台输出(charMap); //{a: 4, b: 2, g: 1, r: 1, h: 1}


-1

var i = 0;

var split_start = new Date().getTime();
while (i < 30000) {
  "1234,453,123,324".split(",").length -1;
  i++;
}
var split_end = new Date().getTime();
var split_time = split_end - split_start;


i= 0;
var reg_start = new Date().getTime();
while (i < 30000) {
  ("1234,453,123,324".match(/,/g) || []).length;
  i++;
}
var reg_end = new Date().getTime();
var reg_time = reg_end - reg_start;

alert ('Split Execution time: ' + split_time + "\n" + 'RegExp Execution time: ' + reg_time + "\n");


-1

下面的逻辑是最简单的,非常容易理解

  //Demo string with repeat char 
  let str = "Coffee"
  //Splitted the str into an char array for looping
  let strArr = str.split("")
  //This below is the final object which holds the result
  let obj = {};
  //This loop will count char (You can also use traditional one for loop)
  strArr.forEach((value,index)=>{
      //If the char exists in the object it will simple increase its value
      if(obj[value] != undefined)
      {
          obj[value] = parseInt(obj[value]) + 1;
      }//else it will add the new one with initializing 1
      else{
          obj[value] =1;
      }      
  });

  console.log("Char with Count:",JSON.stringify(obj)); //Char with Count:{"C":1,"o":1,"f":2,"e":2}

这绝对不是最简单的方法。 - papillon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接