Подсчитайте количество вхождений символа в строку в Javascript - PullRequest
435 голосов
/ 19 мая 2009

Мне нужно посчитать количество вхождений символа в строку.

Например, предположим, что моя строка содержит:

var mainStr = "str1,str2,str3,str4";

Я хочу найти число запятых , символа, которое равно 3. И количество отдельных строк после разбиения по запятой, которое равно 4.

Мне также нужно проверить, что каждая из строк, т.е. str1 или str2 или str3 или str4, не должна превышать, скажем, 15 символов.

Ответы [ 30 ]

1 голос
/ 02 июня 2016

Я использую Node.js v.6.0.0, и самый быстрый из них - с индексом (третий метод в ответе Ло Сауэра).

Второй:

function count(s, c) {
  var n = 0;
  for (let x of s) {
    if (x == c)
      n++;
  }
  return n;
}
0 голосов
/ 06 июня 2018

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");
0 голосов
/ 26 марта 2018
var a = "acvbasbb";
var b= {};
for (let i=0;i<a.length;i++){
    if((a.match(new RegExp(a[i], "g"))).length > 1){
        b[a[i]]=(a.match(new RegExp(a[i], "g"))).length;
    }
}
console.log(b);

В JavaScript вы можете использовать приведенный выше код, чтобы получить вхождение символа в строку.

0 голосов
/ 22 января 2018

Самый быстрый способ, кажется, через оператор индекса:

function charOccurances (str, char)
{
    for (var c = 0, i = 0, len = str.length; i < len; ++i)
    {
        if (str[i] == char)
        {
            ++c;
        }
    }
    return c;
}

Использование:

charOccurances('example/path/script.js', '/') == 2

Или как функция-прототип:

String.prototype.charOccurances = function (char)
{
    for (var c = 0, i = 0, len = this.length; i < len; ++i)
    {
        if (this[i] == char)
        {
            ++c;
        }
    }
    return c;
}

Использование:

charOccurances('example/path/script.js', '/') == 2
0 голосов
/ 17 октября 2017

Я знаю, что это может быть старый вопрос, но у меня есть простое решение для начинающих в JavaScript.

Как новичок, я мог понять только некоторые из решений этого вопроса, поэтому я использовал два вложенных цикла FOR для проверки каждого символа на соответствие каждому другому символу в строке, увеличивая счет 1006 * переменная для каждого найденного символа, равного этому символу.

Я создал новый пустой объект, в котором каждый ключ свойства является символом, а значение - сколько раз каждый символ появлялся в строке (количество).

Пример функции: -

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 голосов
/ 03 октября 2017

Пятый метод в ответе Лео Зауэрса не выполняется, если символ находится в начале строки. например

var needle ='A',
  haystack = 'AbcAbcAbc';

haystack.split('').map( function(e,i){ if(e === needle) return i;} )
  .filter(Boolean).length;

даст 2 вместо 3, потому что функция фильтра Boolean выдает false для 0.

Другая возможная функция фильтра:

haystack.split('').map(function (e, i) {
  if (e === needle) return i;
}).filter(function (item) {
  return !isNaN(item);
}).length;
0 голосов
/ 09 апреля 2013

Мое решение:

function countOcurrences(str, value){
   var regExp = new RegExp(value, "gi");
   return str.match(regExp) ? str.match(regExp).length : 0;  
}
0 голосов
/ 12 февраля 2019

Мое решение с ramda js:

const testString = 'somestringtotest'

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

countLetters(testString)

Ссылка на REPL.

0 голосов
/ 09 июня 2019

Функция принимает строку 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;

} 
0 голосов
/ 24 ноября 2017

Я полагаю, что вы найдете следующее решение очень коротким, очень быстрым, способным работать с очень длинными строками, способным поддерживать поиск по нескольким символам, защищенным от ошибок и способным обрабатывать поиск пустых строк.

function substring_count(source_str, search_str, index) {
    source_str += "", search_str += "";
    var count = -1, index_inc = Math.max(search_str.length, 1);
    index = (+index || 0) - index_inc;
    do {
        ++count;
        index = source_str.indexOf(search_str, index + index_inc);
    } while (~index);
    return count;
}

Пример использования:

console.log(substring_count("Lorem ipsum dolar un sit amet.", "m "))

function substring_count(source_str, search_str, index) {
    source_str += "", search_str += "";
    var count = -1, index_inc = Math.max(search_str.length, 1);
    index = (+index || 0) - index_inc;
    do {
        ++count;
        index = source_str.indexOf(search_str, index + index_inc);
    } while (~index);
    return count;
}

Приведенный выше код исправляет главную ошибку производительности в Jakub Wawszczyk, из-за которой код продолжает искать совпадения даже после того, как indexOf говорит, что его нет, и его версия не работает, потому что он забыл указать входные параметры функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...