我正在构建一个JavaScript函数,它采用单行文本字符串和长度变量,这是预期的对齐宽度(最长的单词永远不会超过此宽度)。以下是更多要求:
\n
(换行符)分隔行(不包括在行长度计数中)\n
不用多说了,这是我的代码:
var justify = function(str, len) {
var re = RegExp("(?:\\s|^)(.{1," + len + "})(?=\\s|$)", "g");
var res = [];
var finalResult = [];
while ((m = re.exec(str)) !== null) {
res.push(m[1]);
}
var lastLine = res.pop();
for (var i = 0; i < res.length; i++) {
var lineLength = res[i].length;
if (lineLength !== len) {
var toAdd = len - lineLength;
var indexOf = res[i].indexOf(' ', 0);
var str2 = res[i];
if ( indexOf === -1 ) {
str2;
}
while ( indexOf > -1 ) {
str2 = str2.substring(0, indexOf + 1) + " " + str2.substring(indexOf + 1);
if ( str2.length < len ) {
indexOf = str2.indexOf(' ', (indexOf + 1));
}
else {
break;
}
}
finalResult.push(str2);
}
}
finalResult.push(lastLine);
return finalResult.join('\n');
}
我正在使用RegExp来划分或接近被禁线长度(len
)的字符串,并将每一行作为新数组中的元素返回。最后一行通过pop
从数组中删除并保存到变量中以供将来在完成的数组上使用。然后,我使用for循环遍历行数组,找出需要添加到行长度的内容以使其达到len
长度。然后,我根据现有空间(通过.substring方法)拆分每条单独的行,并根据需要向这些空间添加空格以填充行。
不幸的是,我的代码没有通过测试,因为我收到错误消息,表明总行数少于预期。 (即Line count is not equal 44 - Expected: 44, instead got: 40
)。
我注意到我的结果也违反了其中一项代码要求(单词之间的差距不得超过一个空格)。例如,我的一行证明如下(空格用冒号:
nisi::::volutpat:ac.
如何更恰当地分配间距?我相信我需要迭代所有空格,因为我尝试的迭代实际上并没有按预期工作。我假设一旦解决了,线数差异的错误也将清除。感谢您提供任何提示或帮助。
答案 0 :(得分:0)
我想您可能正在寻找这个:
var justify = function(str, len) {
var re = RegExp("(?:\\s|^)(.{1," + len + "})(?=\\s|$)", "g");
var res = [];
var finalResult = [];
while ((m = re.exec(str)) !== null) {
res.push(m[1]);
}
for (var i = 0; i < res.length - 1; i++){
if(res[i].indexOf(' ') != -1){
while(res[i].length < len){
for(var j=0; j < res[i].length-1; j++){
if(res[i][j] == ' '){
res[i] = res[i].substring(0, j) + " " + res[i].substring(j);
if(res[i].length == len) break;
while(res[i][j] == ' ') j++;
}
}
}
}
finalResult.push(res[i]);
}
finalResult.push(res[res.length - 1]);
return finalResult.join('\n');
}