Javascript: Как посчитать сколько раз встречается каждый символ в строке? [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 4 года назад .
Как создать функцию, которая принимает один аргумент — строку и возвращает объект, в котором указывается, сколько раз встречается каждый символ в переданной строке. Например,
function countChars("aabbaccd") < // код >
должна вернуть объект типа
Отслеживать
задан 9 ноя 2019 в 20:34
11 1 1 серебряный знак 3 3 бронзовых знака
и где ваши попытки?)
9 ноя 2019 в 20:36
9 ноя 2019 в 20:37
@ThisMan может, это нам задание
– user176262
9 ноя 2019 в 20:38
Вам уже рассказали про reduce — ru.stackoverflow.com/questions/1029758/…
– user176262
9 ноя 2019 в 20:39
Возможный дубликат вопроса: Оптимизация замены символа в строке на число его повторений
9 ноя 2019 в 20:47
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
function countChars_long(str) < var result = <>; var chars = str.split(""); for (var i = 0; i < chars.length; i++) < var count = result[chars[i]]? result[chars[i]] : 0; result[chars[i]] = count + 1; >return result; > function countChars_short(str) < return str.split("").reduce((r, c) =>(r[c] = (r[c] || 0) + 1, r), <>); > console.log(countChars_long("aabbaccd")); console.log(countChars_short("aabbaccd"));
Отслеживать
ответ дан 9 ноя 2019 в 20:49
user176262 user176262
Зачем вы написали решение? Видно же, что это студент, он даже не написал, что как-то пытался выполнить это задание.
9 ноя 2019 в 20:55
Спасибо, буду разбираться, как он работает, чтобы понять полностью
9 ноя 2019 в 21:03
@Leks более или менее. Я добавил длинный вариант.
– user176262
9 ноя 2019 в 21:09
-
Важное на Мете
Связанные
Похожие
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Курсы javascript
Необходимо определить, сколько раз слово встречается в тексте? и как это сделать?
Последний раз редактировалось Rphoenix, 13.11.2017 в 19:14 .
13.11.2017, 18:58
Регистрация: 27.11.2015
Сообщений: 2,899
Rphoenix,
Для начала почитать учебники
поиск всех вхождений
13.11.2017, 19:14
Новичок на форуме
Регистрация: 14.11.2015
Сообщений: 7
Большое спасибо, все получилось.
13.11.2017, 21:22
Интересующийся
Регистрация: 14.07.2017
Сообщений: 21
Зачастую со строками удобнее через regex работать. Не нужно писать кучу сомнительных циклов.
'foo bar foo'.match(/foo/g).length
14.11.2017, 08:21
Регистрация: 30.04.2012
Сообщений: 2,998
'foo bar foo'.split('foo').length - 1
« Проверка всех возможных вариантов | Смена картинки по цвету »
| Похожие темы |
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| В каком направлении и сколько раз был прокручен скролл | webrepa | Events/DOM/Window | 19 | 12.02.2016 14:45 |
| Если в таблице встречается определенное слово, то выделить его. | Webtest | Элементы интерфейса | 0 | 14.09.2014 16:58 |
| Определить сколько раз страница прокручена до конца. | dolte | Events/DOM/Window | 1 | 19.09.2013 22:21 |
| Вырезать слово в тексте и вывести его | kilogram | Серверные языки и технологии | 4 | 29.03.2012 01:41 |
| Поиск в тексте | javascript | jQuery | 3 | 31.05.2011 11:40 |
© Илья Кантор, 2007-2021 О проекте — Обратная связь — Архив форума — Вверх
Полезные методы для строк
Мы рассмотрели базовые понятия, касающиеся строк. Давайте пойдём дальше и рассмотрим, какие полезные операции мы можем выполнять со строками, используя встроенные функции, такие как поиск длины текстовой строки, объединение и разделение строк, замена одного символа из строки другим и многое другое.
| Необходимые знания: | Базовая компьютерная грамотность, базовое понимание HTML и CSS, понимание того, что такое JavaScript. |
|---|---|
| Задача: | Понять, что строки являются объектами, и изучить, как использовать некоторые из основных методов, доступных для этих объектов для управления строками. |
Строки как объекты
Почти всё в JavaScript является объектами. Когда вы создаёте строку, например:
let string = 'This is my string';
ваша переменная становится строковым объектом, и, как результат, ей доступно множество свойств и методов. Можете убедиться в этом, перейдя на страницу String и просмотрев на ней список свойств и методов!
Только не волнуйтесь! Большинство из них вам не нужно знать сейчас на ранней стадии вашего обучения. Но некоторые из них вы, возможно, будете использовать довольно часто. Их мы и рассмотрим.
Введем несколько примеров в консоль разработчика.
Поиск длины строки
Это легко — вы просто используете свойство length . Попробуйте ввести следующие строки:
let browserType = 'mozilla'; browserType.length;
Результатом должно быть число 7, потому что слово «mozilla» состоит из 7 символов. Это свойство можно применить, например, если вы захотите найти длины серии имён, чтобы их можно было отображать по порядку длины или сообщить пользователю, что имя пользователя, которое он ввёл в поле формы, слишком длинное, если оно превышает определённую длину.
Получение определённого строкового символа
Вы можете вернуть любой символ внутри строки, используя обозначение в квадратных скобках. Это означает, что вы добавляете квадратные скобки ([ ]) в конце вашего имени переменной. В квадратных скобках вы указываете номер символа, который хотите вернуть. Например, чтобы получить первую букву, нужно написать:
browserType[0];
Компьютеры считают от 0, а не 1! Чтобы получить последний символ любой строки, мы могли бы использовать следующую строку, объединив эту технику с свойством length :
browserType[browserType.length-1];
Длина слова «mozilla» равна 7, но, поскольку счёт начинается с 0, позиция последнего символа равна 6, поэтому нам нужна length-1 . Такой способ можно использовать, чтобы найти первую букву ряда строк и упорядочить их по алфавиту.
Поиск подстроки внутри строки и её извлечение
- Иногда вам может понадобиться выяснить, присутствует ли меньшая строка внутри большей (обычно мы говорим, что внутри строки есть подстрока). Это можно сделать с помощью метода indexOf () , который принимает одну parameter (en-US) — подстроку, которую вы хотите найти. Введите:
browserType.indexOf('zilla');
browserType.indexOf('vanilla');
Это должно дать вам результат -1. Такое значение возвращается, когда подстрока, в данном случае «vanilla», не найдена в основной строке. Вы можете использовать это, чтобы найти все экземпляры строк, которые не содержат подстроку «mozilla» (для обратного эффекта, используйте оператор отрицания):
if(browserType.indexOf('mozilla') === -1) < // сделать что-то, если 'mozilla' // не является частью этой строки >if(browserType.indexOf('mozilla') !== -1) < // сделать что-то, если 'mozilla' // является частью этой строки >
browserType.slice(0,3);
browserType.slice(2);
Примечание: второй параметр slice() не обязателен: если вы его не включите в код, обрезание закончится на конце оригинальной строки. Есть и другие варианты; изучите страницу slice () , чтобы узнать, что ещё вы можете узнать.
Изменение регистра
Строковые методы toLowerCase () и toUpperCase () преобразовывают все символы в строке в нижний или верхний регистр соответственно. Этот способ можно применить, если вы хотите нормализовать все введённые пользователем данные перед их сохранением в базе данных.
Попробуем ввести следующие строки, чтобы узнать, что происходит:
var radData = 'My NaMe Is MuD'; radData.toLowerCase(); radData.toUpperCase();
Обновление частей строки
Вы можете заменить одну подстроку внутри строки на другую подстроку, используя метод replace () . Этот метод работает очень просто на базовом уровне, но у него есть некоторые продвинутые свойства, но мы пока не будем вдаваться в детали.
Он принимает два параметра — строку, которую вы хотите заменить, и строку, которую вы хотите вставить вместо заменяемой. Попробуйте этот пример:
browserType.replace('moz','van');
Обратите внимание, что для фактического получения обновлённого значения, отражённого в переменной browserType в реальной программе, вам нужно будет установить значение переменной в результате операции; он не просто обновляет значение подстроки автоматически. Таким образом, вы должны были бы написать это: browserType = browserType.replace(‘moz’,’van’);
Активные примеры обучения
В этом разделе мы дадим вам попробовать набить руку и вместе напишем код строковой манипуляции. В каждом упражнении ниже у нас есть массив строк и цикл, который обрабатывает каждое значение в массиве и отображает его в маркированном списке. Вам не нужно понимать массивы или циклы прямо сейчас — это будет объяснено в будущих статьях. Все, что вам нужно сделать в каждом случае, — написать код, который выводит строки в том формате, в котором мы предлагаем.
В каждом примере есть кнопка Сбросить, которую вы можете использовать для сброса кода, если вы допустили ошибку и не можете заставить его работать снова, а кнопку Показать решение вы можете нажать, чтобы увидеть потенциальный ответ, если вы действительно застрянете на решении.
Фильтрация приветственных сообщений
В первом упражнении мы начнём с простого: у нас есть множество сообщений поздравительных открыток, но мы хотим отсортировать их, чтобы перечислять только рождественские сообщения. Мы хотим, чтобы вы заполнили условный тест внутри структуры if( . ), чтобы проверить каждую строку и отобразить её в списке, только если это рождественское сообщение.
- Сначала подумайте о том, как вы можете проверить, является ли сообщение в каждом случае рождественским сообщением. Какая строка присутствует во всех этих сообщениях и какой метод вы можете использовать для проверки?
- Затем вам нужно будет написать условный тест операнд1 оператор операнд2. Соответствует ли результат слева результату справа? Или в этом случае вызов метода слева возвращает результат справа?
- Подсказка. В этом случае, вероятно, полезнее проверить, не является ли часть строки не равной (!==) определённому результату.
h2>Результатh2> div class="output" style="min-height: 125px;"> ul>ul> div> h2>Редактируемый кодh2> p class="a11y-label"> Нажмите Esc, чтобы выйти из поля ввода (Tab вставляет символ табуляции). p> textarea id="code" class="playable-code" style="height: 290px; width: 95%"> var list = document.querySelector('.output ul'); list.innerHTML = ''; var greetings = ['С днём рождения!', 'С Рождеством, любовь моя', 'Счастливого Рождества всей твоей семье', 'Ты — та, кто нужен мне на Рождество', 'Поправляйся скорее']; for (var i = 0; i < greetings.length; i++) < var input = greetings[i]; // Ваше решение должно быть в фигурных скобках // ниже: вы должны что-то добавить if (greetings[i]) < var result = input; var listItem = document.createElement('li'); listItem.textContent = result; list.appendChild(listItem); >> textarea> div class="playable-buttons"> input id="reset" type="button" value="Сбросить" /> input id="solution" type="button" value="Показать решение" /> div>
html font-family: sans-serif; > h2 font-size: 16px; > .a11y-label margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body margin: 10px; background: #f5f9fa; >
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode() eval(textarea.value); > reset.addEventListener("click", function () textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Показать решение"; updateCode(); >); solution.addEventListener("click", function () if (solution.value === "Показать решение") textarea.value = solutionEntry; solution.value = "Спрятать решение"; > else textarea.value = userEntry; solution.value = "Показать решение"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nlist.innerHTML = '';\nvar greetings = ['С днём рождения!',\n 'С Рождеством, любовь моя',\n 'Счастливого Рождества всей твоей семье',\n 'Ты — та, кто нужен мне на Рождество',\n 'Поправляйся скорее'];\n\nfor(var i = 0; i < greetings.length; i++) \n>"; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e) if (e.keyCode === 9) e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27) textarea.blur(); > >; function insertAtCaret(text) var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function () // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Показать решение") userEntry = textarea.value; > else solutionEntry = textarea.value; > updateCode(); >;
Исправление регистра (размера букв в тексте—прим. пер.)
В этом упражнении у нас есть названия городов в Великобритании, но написанных разным регистром. Мы хотим, чтобы вы изменили их так, чтобы они были в нижнем регистре, за исключением первой буквы. Хороший способ сделать это:
- Преобразуйте всю строку, содержащуюся в переменной input, в нижний регистр и сохраните её в новой переменной.
- Возьмите первую букву строки в этой новой переменной и сохраните её в другой переменной.
- Используя эту последнюю переменную в качестве подстроки, замените первую букву строчной строки первой буквой строчной строки, изменённой на верхний регистр. Сохраните результат этой процедуры замены в другой новой переменной.
- Измените значение переменной result на равную конечному результату (не input ).
Примечание: Подсказка — параметры строковых методов не обязательно должны быть строковыми литералами; они также могут быть переменными или даже переменными с вызываемым ими методом.
h2>Результатh2> div class="output" style="min-height: 125px;"> ul>ul> div> h2>Редактируемый кодh2> p class="a11y-label"> Нажмите Esc, чтобы выйти из поля ввода (Tab вставляет символ табуляции). p> textarea id="code" class="playable-code" style="height: 250px; width: 95%"> var list = document.querySelector('.output ul'); list.innerHTML = ''; var cities = ['лонДон', 'МанЧЕСТёр', 'БиРминГЕМ', 'лиВЕРпуЛЬ']; for(var i = 0; i < cities.length; i++) < var input = cities[i]; // пишите код ниже var result = input; var listItem = document.createElement('li'); listItem.textContent = result; list.appendChild(listItem); >textarea> div class="playable-buttons"> input id="reset" type="button" value="Сбросить" /> input id="solution" type="button" value="Показать решение" /> div>
html font-family: sans-serif; > h2 font-size: 16px; > .a11y-label margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body margin: 10px; background: #f5f9fa; >
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode() eval(textarea.value); > reset.addEventListener("click", function () textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Показать решение"; updateCode(); >); solution.addEventListener("click", function () if (solution.value === "Показать решение") textarea.value = solutionEntry; solution.value = "Спрятать решение"; > else textarea.value = userEntry; solution.value = "Показать решение"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nlist.innerHTML = '';\nvar cities = ['лонДон', 'МанЧЕСТёр', 'БиРминГЕМ', 'лиВЕРпуЛЬ'];\n\nfor(var i = 0; i < cities.length; i++) "; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e) if (e.keyCode === 9) e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27) textarea.blur(); > >; function insertAtCaret(text) var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function () // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Показать решение") userEntry = textarea.value; > else solutionEntry = textarea.value; > updateCode(); >;
Создание новых строк из старых частей
В этом последнем упражнении массив содержит кучу строк, содержащих информацию о железнодорожных станциях на севере Англии. Строки представляют собой элементы данных, которые содержат трёхбуквенный код станции, за которым следуют некоторые машиночитаемые данные, за которыми следует точка с запятой, а затем название станции, пригодное для чтения человеком. Например:
MAN675847583748sjt567654;Manchester Piccadilly
Мы хотим извлечь код станции и имя и поместить их в строку со следующей структурой:
MAN: Manchester Piccadilly
Мы бы рекомендовали реализовать это следующим образом:
- Извлеките трёхбуквенный код станции и сохраните его в новой переменной.
- Найдите номер символьного номера точки с запятой.
- Извлеките название для чтения человеком, используя номер индекса точки с запятой в качестве контрольной точки и сохраните его в новой переменной.
- Объедините две новые переменные и строковый литерал, чтобы сделать финальную строку.
- Измените значение переменной result равной конечной строке (не input ).
h2>Результатh2> div class="output" style="min-height: 125px;"> ul>ul> div> h2>Редактируемый кодh2> p class="a11y-label"> Нажмите Esc, чтобы выйти из поля ввода (Tab вставляет символ табуляции). p> textarea id="code" class="playable-code" style="height: 285px; width: 95%"> var list = document.querySelector('.output ul'); list.innerHTML = ''; var stations = ['MAN675847583748sjt567654;Manchester Piccadilly', 'GNF576746573fhdg4737dh4;Greenfield', 'LIV5hg65hd737456236dch46dg4;Liverpool Lime Street', 'SYB4f65hf75f736463;Stalybridge', 'HUD5767ghtyfyr4536dh45dg45dg3;Huddersfield']; for (var i = 0; i < stations.length; i++) < var input = stations[i]; // пишите ваш код ниже var result = input; var listItem = document.createElement('li'); listItem.textContent = result; list.appendChild(listItem); >textarea> div class="playable-buttons"> input id="reset" type="button" value="Сбросить" /> input id="solution" type="button" value="Показать решение" /> div>
html font-family: sans-serif; > h2 font-size: 16px; > .a11y-label margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body margin: 10px; background: #f5f9fa; >
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode() eval(textarea.value); > reset.addEventListener("click", function () textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Показать решение"; updateCode(); >); solution.addEventListener("click", function () if (solution.value === "Показать решение") textarea.value = solutionEntry; solution.value = "Спрятать решение"; > else textarea.value = userEntry; solution.value = "Показать решение"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nlist.innerHTML = '';\nvar stations = ['MAN675847583748sjt567654;Manchester Piccadilly',\n 'GNF576746573fhdg4737dh4;Greenfield',\n 'LIV5hg65hd737456236dch46dg4;Liverpool Lime Street',\n 'SYB4f65hf75f736463;Stalybridge',\n 'HUD5767ghtyfyr4536dh45dg45dg3;Huddersfield'];\n\nfor(var i = 0; i < stations.length; i++) "; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e) if (e.keyCode === 9) e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27) textarea.blur(); > >; function insertAtCaret(text) var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function () // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Показать решение") userEntry = textarea.value; > else solutionEntry = textarea.value; > updateCode(); >;
Заключение
Нельзя не согласиться с тем, что способность обрабатывать слова и предложения в программировании очень важна — особенно в JavaScript, поскольку веб-сайты — все связаны с людьми. Эта статья дала вам основы, которые вам нужно знать о манипуляции строками на данный момент. Это пойдёт вам на пользу, когда вы займётесь более сложными темами в будущем. Далее мы рассмотрим последний важный тип данных, на который нам нужно сосредоточиться в краткосрочной перспективе — массивы.
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 2 дек. 2023 г. by MDN contributors.
Как посчитать количество одинаковых элементов в массиве js
Для поиска одинаковых элементов в массиве нагляднее всего воспользоваться циклом:
const nums = [1, 2, 1, 4, 5, 1, 7, 8, 1, 10]; let count = 0; for (let i = 0; i nums.length; i +=1 ) if (nums[i] === 1) count += 1; > > // Вывод: 4
Или например, необходимо посчитать сколько раз встречается каждая цифра в исходном массиве, с помощью reduce:
const nums = [1, 2, 7, 4, 5, 2, 7, 8, 1, 10]; const res = nums.reduce((acc, i) => if (acc.hasOwnProperty(i)) acc[i] += 1; > else acc[i] = 1; > return acc; >,<>) // Вывод:
05 апреля 2023
Еще один способ. Можно использовать метод sort :
const arr = [1, 5, 0, 3, 5, 8, 9]; const unique = [. new Set(arr)]; const diff = arr.length - unique.length;
В переменной unique мы храним массив уникальных значений, полученный из основного массива arr . Для этого мы воспользовались конструкцией new Set() для создания новой коллекции уникальных значений. С помощью десктруктуризации мы перевели этот объект коллекции к массиву. Затем, с помощью свойства length на обоих массивах мы получили разницу, которая равна количеству элементов в массиве с одинаковыми значениями.