Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить несколько подстрок из одной строки (https://javascript.ru/forum/misc/84103-poluchit-neskolko-podstrok-iz-odnojj-stroki.html)

NovichokJS 03.06.2022 10:09

Получить несколько подстрок из одной строки
 
Не пойму почему не получаю нужный результат. Выводит только первые 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
*/

Дмитрий Луценко 03.06.2022 10:26

Здравствуйте.

Ваша проблема заключается в том, что Вы не двигаете индекс для слайсинга.

Дмитрий Луценко 03.06.2022 10:26

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
*/

NovichokJS 03.06.2022 10:40

я понял, спасибо

рони 03.06.2022 10:49

Дмитрий Луценко,
пост #3 что делает строка 12?

NovichokJS 03.06.2022 10:53

я немного уже преобразовал:

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');

}

ksa 03.06.2022 10:53

Цитата:

Сообщение от NovichokJS
Не пойму почему не получаю нужный результат. Выводит только первые 4 символа.

Так ты так и написал...
Цитата:

Сообщение от NovichokJS
let chunk = str.substring(0, len);


NovichokJS 03.06.2022 10:54

есть еще правда одно условие : функция должна делить на подстроки длиной 10 символов, если не задан второй аргумент.
Как это сделать корректно?

ksa 03.06.2022 10:59

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))

NovichokJS 03.06.2022 11:14

ksa, большое спасибо вам!

рони 03.06.2022 11:30

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 03.06.2022 12:08

рони, по одному символу читать строку - моветон... :)

рони 03.06.2022 12:12

ksa,
:lol: куда спешить?!

ksa 03.06.2022 12:17

рони, я тут собеседования провожу с кандидатами... Упражнения им разные даю...
Проще чем вот эта задачка.
И они почти всегда делают "перебор строки посимвольно". А я их критикую. :D

рони 03.06.2022 12:30

ksa,
match тоже можно "покритиковать", если строка будет пустая или два символа?

ksa 03.06.2022 12:51

Цитата:

Сообщение от рони
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))

NovichokJS 03.06.2022 12:59

усложнил себе задачу и хочу чтобы последняя подстрока дополнялась точками если не хватает по кол-ву символам, таким образом:

console.log(splitText('abcdefghijklmn', 4));

// Output:

/*  Abcd
    Efgh
    Ijkl
    Mn..
*/


Как сделать такое можно?

NovichokJS 03.06.2022 13:08

куда добавить в действие переменную 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');
}

Дмитрий Луценко 03.06.2022 13:17

Проверьте длину подстроки, записанной в newStr, если она меньше положенного, добавьте точки

NovichokJS 03.06.2022 13:18

Цитата:

Сообщение от Дмитрий Луценко (Сообщение 545856)
Проверьте длину подстроки, записанной в newStr, если она меньше положенного, добавьте точки

Спасибо, пробую!

NovichokJS 03.06.2022 13:23

if (newStr.length < len) {
            newStr += dot;
        }

Output: 

Abcd
Efgh
Ijkl
Mn.


добавляет одну точку, что и логично. Но вот как сделать чтоб добавляло нужное кол-во точек?

Дмитрий Луценко 03.06.2022 13:23

Цитата:

Сообщение от NovichokJS (Сообщение 545857)
Спасибо, пробую!

На заметку:

let str = "44"

str = str.repeat(4);
console.log(str);
//44444444

Дмитрий Луценко 03.06.2022 13:25

Цитата:

Сообщение от NovichokJS (Сообщение 545858)
if (newStr.length < len) {
            newStr += dot;
        }

Output: 

Abcd
Efgh
Ijkl
Mn.


добавляет одну точку, что и логично. Но вот как сделать чтоб добавляло нужное кол-во точек?

Вы мыслите почти верно)

Дмитрий Луценко 03.06.2022 13:32

Давайте подскажу решение способом посимвольного добавления:

Создаю переменную для хранения разницы между текущим размером newStr и len.

Пока переменная не равна 0, я буду добавлять к newStr нужный символ. мою переменную я затем уменьшаю на 1.

NovichokJS 03.06.2022 13:33

Цитата:

Сообщение от Дмитрий Луценко (Сообщение 545862)
Давайте подскажу решение способом посимвольного добавления:

Создаю переменную для хранения разницы между текущим размером newStr и len.

Пока переменная не равна 0, я буду добавлять к newStr нужный символ. мою переменную я затем уменьшаю на 1.

получилось по ходу

if (newStr.length < len) {
            dot = dot.repeat(len - newStr.length);
            newStr += dot;
        }


Спасибочки!

Дмитрий Луценко 03.06.2022 13:37

Цитата:

Сообщение от NovichokJS (Сообщение 545863)
получилось по ходу

if (newStr.length < len) {
            dot = dot.repeat(len - newStr.length);
            newStr += dot;
        }


Спасибочки!

Изящнее не придумаешь :)
:victory:

рони 03.06.2022 13:42

Цитата:

Сообщение от NovichokJS
if (newStr.length < len) {

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**
        */

NovichokJS 03.06.2022 15:06

Цитата:

Сообщение от рони (Сообщение 545865)
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, время: 00:33.