JavaScript

时间:2016-01-24 19:34:52

标签: javascript arrays

我正在构建一个JavaScript函数,它采用单行文本字符串和长度变量,这是预期的对齐宽度(最长的单词永远不会超过此宽度)。以下是更多要求:

  • 使用空格填补单词之间的空白
  • 每一行都需要包含尽可能多的单词,以适应给定的长度。
  • 使用\n(换行符)分隔行(不包括在行长度计数中)
  • 单词之间的差距不能超过一个空格
  • 行需要以word而不是空格结束
  • 空行距离从一条线越过越小。
  • 最后一行没有得到理由(仅限单一间距),不能有\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.

如何更恰当地分配间距?我相信我需要迭代所有空格,因为我尝试的迭代实际上并没有按预期工作。我假设一旦解决了,线数差异的错误也将清除。感谢您提供任何提示或帮助。

1 个答案:

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

}