Подсчет количества вхождений символа в строке на JavaScript
Я столкнулся с задачей, где мне необходимо подсчитать количество вхождений определённого символа в строке.
Например, у меня есть следующая строка:
var mainStr = "str1,str2,str3,str4";
Я хочу узнать количество запятых ,
, которые составляет 3. Также мне нужно подсчитать количество отдельных строк, полученных после разбиения по запятой, которое будет равным 4.
Кроме того, мне необходимо проверить, чтобы каждая из строк, то есть str1, str2, str3 и str4, не превышала, скажем, 15 символов.
Как лучше всего реализовать это на JavaScript?
5 ответ(ов)
Добавление этой функции в прототип строки в JavaScript можно сделать следующим образом:
String.prototype.count = function(c) {
var result = 0, i = 0;
for (i; i < this.length; i++) {
if (this[i] === c) result++;
}
return result;
};
Теперь вы можете использовать этот метод для подсчета вхождений символа в строку. Например:
console.log("strings".count("s")); // 2
Этот код добавляет метод count
к прототипу строки, который принимает символ c
в качестве аргумента и возвращает количество его вхождений в строку.
Чтобы узнать количество вхождений символа в строке, можно просто использовать метод split.
Пример:
mainStr.split(',').length // возвращает 4, что соответствует количеству строк после разделения по запятой
Чтобы получить количество запятых, нужно вычесть 1 из длины массива:
mainStr.split(',').length - 1 // возвращает 3, что соответствует количеству запятых
Таким образом, вы можете легко подсчитать количество вхождений символа в строке.
ОБНОВЛЕНИЕ: Это может показаться простым, но это не самый быстрый способ. Смотрите результаты тестов ниже.
Удивительно, что за 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, "iteration(s)");
let sum = 0; // убедимся, что компилятор не оптимизирует код
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 итераций
replaceAll duration 2.6167500019073486 (sum 40000)
split duration 2.0777920186519623 (sum 40000)
100000 итераций
replaceAll duration 17.563208997249603 (sum 400000)
split duration 8.087624996900558 (sum 400000)
1000000 итераций
replaceAll duration 128.71587499976158 (sum 4000000)
split duration 64.15841698646545 (sum 4000000)
10000000 итераций
replaceAll duration 1223.3415840268135 (sum 40000000)
split duration 629.1629169881344 (sum 40000000)
Вот аналогичное решение, но оно использует Array.prototype.reduce
:
function countCharacters(char, string) {
return string.split('').reduce((acc, ch) => ch === char ? acc + 1 : acc, 0);
}
Как упоминалось ранее, метод String.prototype.split
работает значительно быстрее, чем String.prototype.replace
.
Если вы ищете способ посчитать количество символов '_'
в строке с использованием регулярных выражений, ваш код действительно делает это довольно компактно и читаемо. Однако, если вы хотите улучшить читаемость и производительность, можно использовать метод split()
для разделения строки на массив и затем просто получить длину этого массива. Вот пример, который делает то же самое, но с более явным подходом:
const countUnderscores = (key) => {
return key.split('_').length - 1;
};
// Пример использования
const key = "a_b_c__d";
console.log(countUnderscores(key)); // Выведет 3
В этом решении мы разбиваем строку по символу '_'
и затем вычитаем 1 из длины полученного массива, чтобы получить количество подчеркиваний. Это также может быть более эффективным для больших строк, так как избегает создания промежуточной строки.
Как присвоить многострочную строку переменной?
Преобразование объекта JS в строку JSON
Преобразование объекта в строку
Как преобразовать строку, разделённую запятыми, в массив?
Как узнать, содержится ли определенная строка в массиве на JavaScript/jQuery?