Получить несколько подстрок из одной строки
Не пойму почему не получаю нужный результат. Выводит только первые 4 символа. Помогите пожста.
const splitText = (str, len) => {
const strArr = [];
if (typeof str !== 'string') { return null; }
let chunk = str.substring(0, len);
strArr.push(chunk[0].toUpperCase() + chunk.slice(1));
return strArr.join('\n');
}
console.log(splitText('abcdefghijklmnop', 4));
/* Abcd
Efgh
Ijkl
Mnop
*/
|
Здравствуйте.
Ваша проблема заключается в том, что Вы не двигаете индекс для слайсинга. |
const splitText = (str, len) => {
const strArr = [];
let i = 0;
if (typeof str !== 'string') { return null; }
while (i < str.length) {
let chunk = str.substring(i, i + len);
strArr.push(chunk[0].toUpperCase() + chunk.slice(1));
strArr.join('\n');
i += (len);
}
return strArr;
}
console.log(splitText('abcdefghijklmnop', 4));
/* Abcd
Efgh
Ijkl
Mnop
*/
|
я понял, спасибо
|
Дмитрий Луценко,
пост #3 что делает строка 12? |
я немного уже преобразовал:
const splitText = (str, len) => {
const strArr = [];
let startPos = 0;
if (typeof str !== 'string') { return null; }
while (startPos < str.length) {
let chunk = str.substring(startPos, startPos + len);
strArr.push(chunk[0].toUpperCase() + chunk.slice(1));
startPos += len;
}
return strArr.join('\n');
}
|
Цитата:
Цитата:
|
есть еще правда одно условие : функция должна делить на подстроки длиной 10 символов, если не задан второй аргумент.
Как это сделать корректно? |
NovichokJS, предложу такой вариант...
function splitText(txt, len = 10){
txt = txt.match(new RegExp(`.{${len}}`,'g'))
txt = txt.map(el => el[0].toUpperCase() + el.slice(1))
return txt.join('\n')
}
alert(splitText('abcdefghijklmnop', 4))
|
ksa, большое спасибо вам!
|
NovichokJS,
:write: :)
const splitText = (str, len = 10) => {
if (typeof str !== 'string') {
return null;
}
let txt = '';
for (let i = 0; i < str.length; i++) {
let k = i % len, e = str[i];
txt += k == 0 ? e.toUpperCase() : k == len - 1 ? `${e}\n` : e
}
return txt;
}
console.log(splitText('abcdefghijklmnop', 4));
/* Abcd
Efgh
Ijkl
Mnop
*/
|
рони, по одному символу читать строку - моветон... :)
|
ksa,
:lol: куда спешить?! |
рони, я тут собеседования провожу с кандидатами... Упражнения им разные даю...
Проще чем вот эта задачка. И они почти всегда делают "перебор строки посимвольно". А я их критикую. :D |
ksa,
match тоже можно "покритиковать", если строка будет пустая или два символа? |
Цитата:
Я в некоторых упражнениях указываю - без регулярок. Ведь результат "нарезкой" по len символов отработает быстрее. Цитата:
function splitText(txt, len = 10){
txt = txt.match(new RegExp(`.{0,${len}}`,'g'))
txt = txt.map(el => el === '' ? '' : el[0].toUpperCase() + el.slice(1))
if (txt[txt.length -1] === '') txt.pop()
return txt.join('\n')
}
alert(splitText('abcdefghijklmnop', 4))
alert(splitText('ab', 4))
alert(splitText('', 4))
|
усложнил себе задачу и хочу чтобы последняя подстрока дополнялась точками если не хватает по кол-ву символам, таким образом:
console.log(splitText('abcdefghijklmn', 4));
// Output:
/* Abcd
Efgh
Ijkl
Mn..
*/
Как сделать такое можно? |
куда добавить в действие переменную dot?
const splitString = (str, len = 10) => {
if (typeof str !== 'string') { return null; }
let arr = [];
let startPos = 0;
let dot = '.'
while (startPos < str.length) {
let newStr = str.substring(startPos, startPos + len);
arr.push(newStr[0].toUpperCase() + newStr.slice(1));
startPos += len;
}
return arr.join('\n');
}
|
Проверьте длину подстроки, записанной в newStr, если она меньше положенного, добавьте точки
|
Цитата:
|
if (newStr.length < len) {
newStr += dot;
}
Output:
Abcd
Efgh
Ijkl
Mn.
добавляет одну точку, что и логично. Но вот как сделать чтоб добавляло нужное кол-во точек? |
Цитата:
let str = "44" str = str.repeat(4); console.log(str); //44444444 |
Цитата:
|
Давайте подскажу решение способом посимвольного добавления:
Создаю переменную для хранения разницы между текущим размером newStr и len. Пока переменная не равна 0, я буду добавлять к newStr нужный символ. мою переменную я затем уменьшаю на 1. |
Цитата:
if (newStr.length < len) {
dot = dot.repeat(len - newStr.length);
newStr += dot;
}
Спасибочки! |
Цитата:
:victory: |
Цитата:
let n = str.length % len; str = str.padEnd(n + str.length, dot);
const splitText = (str, len = 10, dot = '*') => {
if (typeof str !== 'string') {
return null;
}
let n = str.length % len;
str = str.padEnd(n + str.length, dot);
let txt = '';
for (let i = 0; i < str.length; i++) {
let k = i % len, e = str[i];
txt += k == 0 ? e.toUpperCase() : k == len - 1 ? `${e}\n` : e
}
return txt;
}
console.log(splitText('abcdefghijklmn', 4));
/* Abcd
Efgh
Ijkl
Mn**
*/
|
Цитата:
|
| Часовой пояс GMT +3, время: 09:00. |