#javascript
#javascript
Вопрос:
Я пытаюсь создать функцию «Кодирования длины выполнения», и я застрял посередине.
Например, у меня есть строка: "RRRTTTFBB"
и я пытаюсь разделить ее на массив такого типа: ["RRR", "TTT", "F", "BB"]
.
Мне удалось поместить в элементы только 1 ключ массива вот так: ["RR" "R" "TT" "T" ....]
Я пытался сделать это с помощью цикла while, для цикла, if / else, переключения, но я не могу понять, что я делаю не так.
function rleFunc(str) {
let newArr = [];
const strTrim = str.trim();
const strUp = strTrim.toUpperCase();
const arr = strUp.split("");
const arrLength = arr.length;
// Anyone has idea what to put here?? I'm lost
return newArr;
}
Комментарии:
1. Можете ли вы поделиться версией, которую вы пробовали с
for
циклом (кажется, наиболее подходящим для задачи), и уточнить, что было не так? Помните, что SO не является бесплатным сервисом для написания кода.2. Я не просил бесплатного кодирования. новый массив — это всего лишь часть моего процесса. У меня его больше нет, потому что я многое удалил и перепробовал!
Ответ №1:
Альтернативным подходом было бы использовать регулярное выражение с .match
, чтобы получить желаемый результат:
const str = "RRRTTTFBB";
console.log(str.match(/(.)1*/g));
Это работает благодаря выражению:
(.)
: Означает группировать любой символ1*
: Означает использовать ранее сгруппированный символ и сопоставить его с нулевым количеством вхождений/g
: Означает повторение этого шаблона для всей строки (а не только для первого вхождения)
Ответ №2:
const result = [];
let count = 1;
const input = "RRRTTTFBB";
for(let index = 1; index < input.length; index ) {
if(input[index] !== input[index - 1]) {
result.push(input[index - 1].repeat(count));
count = 1;
} else count ;
}
Комментарии:
1. Хотя эта команда может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
2. «Попробовать» никогда не является ответом
Ответ №3:
function group(arr) {
const groups = [arr[0]]
for (const char of arr.slice(1)) {
const last = groups.length - 1
if (char === groups[last][0]) {
groups[last] = char
} else {
groups.push(char)
}
}
return groups
}
console.log(group('RRRTTTFBB'))
Комментарии:
1. @JonasWilms действительно потребовалось несколько настроек. Пересмотр помогает 🙂
Ответ №4:
Я бы рекомендовал не использовать регулярные выражения для тривиальных задач или если вам это не нужно. Также, если вычисляемая строка является пользовательским вводом. Это может привести к блокировке работы в узле. Прочитайте об этом здесь:https://nodejs.org/en/docs/guides/dont-block-the-event-loop /
arr="RRRRTTHHHJJJHHJ"
const map = new Map;
for (const char of arr.split('')) {
if (map.has(char)) {
map.set(char, map.get(char) char)
} else {
map.set(char, char)
}
}
console.log([...map.values()]);
Комментарии:
1. любые комментарии к понижающему голосованию были бы очень полезны.