Функция работает не совсем как нужно!
Вот код:
String.prototype.chunk = function(length) {
const lines = this.split(`\n`).flatMap(line => line.trim().replace(/\s*\n\s*/g,"\n").match(new RegExp('[^]{1,' + +length + '}', 'g')));
const result = []
for(line of lines){
if(result.length <= 0){
result.push(line)
}
else if (result[result.length -1].length < length){
result + line
}
else{
result.push(line)
}
}
return result;
}
Он выводит лишь 1 строчку
например у меня есть текст:
Я Енд,или же Kristalkill\nМне 14 лет.chunk(10) то он выведет [Я Енд,или же],а должен вывести ['Я Енд,или же','Kristalkil,'l\n','Мне 14 лет'],в чём проблема и как пофиксить?
UPD1: Вот,что смог сделать(не без помощи друзей),но пока результат не очень утешителен
String.prototype.chunk = function(length) {
let result = []
let lines = this.trim().match(new RegExp('[^]{1,' + +length+ '}', 'g')).filter(x => x);
for (let line of lines){
result.push(line)
}
return result
}
Ответы (2 шт):
Была бы задача - просто разбить на "чанки" в размере до min(length, "до первого \n"), подошла бы такая регулярка: /[^\n]{0,9}\n|[^]{1,10}/g — т.е. всё что угодно, кроме переноса строки, от 0 до 9 штук и до первого переноса строки. ИЛИ | всё что угодно от 1 до 10 шт:
let str = "Я Енд,или же Kristalkill\n\nМне 14 лет";
String.prototype.chunk = function(len) {
let reg = new RegExp("[^\\n]{0," + (len-1) + "}\\n|[^]{1," + len + "}", "g");
let lines = this.trim().match(reg);
return lines
};
console.log( str.chunk(10) );
Но необходимость "не учитывать пробелы" делает невозможным решить это одной регуляркой. Решил бы таким циклом:
String.prototype.chunk = function(len) {
let result = [], curr_chunk = "", counter = 0;
for (let char of this) {
switch (char) {
case " ": // Пробел? Добавляет в текущую строку, ничего больше не делая
curr_chunk += " ";
break;
case "\n": // Перенос строки? Считает как отдельный chunk + сбрасывает счетчики
push_n_reset(curr_chunk + "\n");
break;
default: // Любой другой символ
curr_chunk += char; // +символ к текущей строке, увеличивает счетчик
if (++counter == len) push_n_reset(curr_chunk); // Дошел до len? push!
}
}
if (curr_chunk) result.push(curr_chunk); // Остался кусок строки после перебора.
return result;
/***/
function push_n_reset(chunk) {
result.push(chunk);
curr_chunk = "";
counter = 0;
}
};
let str = "Я Енд,или же Kristalkill\nМне 14 лет";
console.log(str.chunk(10));
Если должен вырезать пробелы вначале и конце каждого chunk - можно вызывать функцию так: push_n_reset( curr_chunk.trim() );
(За основу взят вариант @OPTIMUS PRIME)
Вроде и одной регуляркой выходит:
String.prototype.chunk = function(len){
return this.match(new RegExp("(?: *[^\\n]){0," + (len-1) + "}\\n|(?: *.){1," + len + "}", "g"))
}
console.log("Я Енд,или же Kristalkill\nМне 14 лет".chunk(10))
И со своим тримом, т. к. .trim() убирает \n:
String.prototype.chunk = function(len){
return this.match(new RegExp("(?: *[^\\n]){0," + (len-1) + "}\\n|(?: *.){1," + len + "}", "g"))
.map(c=>c.replace(/^ +| +$/g, ''))
}
console.log("Я Енд,или же Kristalkill\nМне 14 лет".chunk(10))
Короткие строки в чанк не склеиваются.