обрезка строки по 1 символу с записью в массив
есть строка 'abccdddeeeee'
я хочу получить из нее массив вида ['a', 'b', 'c', 'cc', 'd', 'dd', 'ddd', 'e', 'ee', 'eee', 'eeee', 'eeeee']
в чем здесь проблема?
let str = 'abccdddeeeee';
let arrStr = str.match(/([a-z])(\1)*/g);
let arrPars = [];
arrStr.forEach((el) => {
for (let i = 0; i < el.length; i++) {
let n = el.length;
while (n >= 0) {
arrPars.push(el.substr(0, el - n));
n--;
}
}
});
console.log(arrStr);
Ответы (1 шт):
Автор решения: vsemozhebuty
→ Ссылка
В вашем коде есть такие недочёты:
(\1)*в регулярке избыточно, достаточно\1*— хоть это не влияет на результат, это убирает лишнее запоминание скобок и проясняет регулярку.for (let i = 0; i < el.length; i++) {— этот цикл тоже лишний, так вы зачем-то умножаете проходы по символам каждой группы и в результат попадают лишние значения. Достаточно циклаwhile.let n = el.length;— тут у вас готовится ошибка на единицу, в результат попадут пустые строки (substrпервый раз вырежет строку нулевой длины).el.substr(0, el - n)— тут скорее всего вместо второгоel(строки) имелось в видуel.length.console.log(arrStr);— видимо, имелось в видуconsole.log(arrPars);.
Вот так ваш вариант вроде работает:
let str = 'abccdddeeeee';
let arrStr = str.match(/([a-z])\1*/g);
let arrPars = [];
arrStr.forEach((el) => {
let n = el.length - 1;
while (n >= 0) {
arrPars.push(el.substr(0, el.length - n));
n--;
}
});
console.log(arrPars);
А этот просто для коллекции.
const str = 'abccdddeeeee';
const arrStr = str.match(/([a-z])\1*/g);
const arrPars = arrStr.flatMap(
el => [...el].map((char, i) => char.repeat(i + 1))
);
console.log(arrPars);