在JavaScript中将字符串转换为格式化的段落

时间:2016-04-02 02:26:20

标签: javascript

编辑:由于人们似乎有点困惑,我会尽力澄清。

基本上,你所采用的字符串是一个可变的字符长度,可以是任意数量的行。

故障是字符串不得切断一个字。所以,作为另一个例子,字符串:

'跳狐'分为2个单独的行。 中间字符是'u',所以两行将是: 第1行:'跳跃' 第2行:'Fox' 防止这个词被切断。这就是两个限制。

所以,我有这个问题:

给定单行文本字符串和最大行值,编写格式化输入文本的函数,即:根据字符均匀地划分文本,并为字符串的每个部分返回一个新行。但是不要切断一条线 - 也就是说,如果你有1000个字符和2行,你可以增加第一行的大小来捕获第500个字符中间的最后一个字的结尾。

我正试图用JavaScript解决它。有小费吗?

。这很简单,只需返回没有这种空白格式的行,但我完全迷失了。

function formatString(string, numlines) {
  var length = string.length;
  console.log(length);
  var words = string.split(' ');
  var paraLength = parseInt(string.length/numlines);
  console.log(paraLength)

  var paragraph = [];  
  for(var i=0; i<length;) {
    // console.log('i is: ', i);
    console.log('start of string is: ', string.charAt(i));
    console.log('end of string is: ', string.charAt(i+paraLength+1));
    console.log('if true? ', string.indexOf(i) )
    if (string.charAt(i+paraLength) == ' ') {
      var thing = string.substr(i,i+paraLength);
      console.log('if thing is: ', thing);
      i+=paraLength;
      console.log('if i is: ', i);
      paragraph.push(thing);
    } else {
      var thing = string.substr(i,i+paraLength);
      console.log('else thing is: ', thing);
      console.log('blah is: ',i+paraLength+1 >= length);
      while (string.charAt(i+paraLength) != ' ' && i+paraLength < length) {
        thing.concat(string.charAt(i+paraLength+1));
        thing.concat('hi')
        console.log('else thing is: ', thing);
        i+=1;
        console.log('i is: ', i);
      }
      paragraph.push(thing);
      i+= paraLength;
    }
  }

  return paragraph.map(function(d) {
    console.log('d is: ', d);
    return d;
  }).join('')

}
console.log(formatString('hello world blah blah blah', 2));

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,这可能会有所帮助:

function formatString(string, numlines) {
    var length = string.length;
    var paraLength = Math.round((string.length)/numlines);
    var paragraphs = [];
    for (var i=0; i<numlines; i++) {
        var marker = paraLength;
        //if the marker is right after a space, move marker back one character
        if (string.charAt(marker-1) == " ") {
            marker--; 
        }
        //move marker to end of a word if it's in the middle
        while(string.charAt(marker) != " " && string.charAt(marker) != "") {
            marker++;
        }
        var nextPara = string.substring(0, marker)
        paragraphs.push(nextPara)
        string = string.substring((nextPara.length+1),string.length)
    }
    return paragraphs
}

这将返回一个包含各个段落的数组。

formatString("The jumping fox", 2) // => ["The jumping", "fox"]

答案 1 :(得分:2)

建议的算法&#34;你可以增加第一行的大小来捕获第500个字符中间的最后一个字的结尾&#34;有一个致命的缺陷:如果你的最后一个字长于length(sentence)/num_lines,所以你跳到下一个单词&#39;,你在那行打印出太多的单词,最后说的话太少 - 可能根本没有 - 在最后一行。

这可以通过不将字符串视为字符序列(您需要检查每个字符以查看它是否为空格)而非字符序列来解决。然后,算法是每行必须出现num_words/num_lines。使用Math.ceil向上舍入,这样您就可以确保每行至少出现一个单词。

有了这个,您可以创建一个基本的测试用例,以便在2中精确地分割单词列表。可以使用split函数完成拆分本身,但我更喜欢正则表达式match,所以所有空间都保留下来。 match返回一个匹配数组,每个匹配项都是一个单词加上后面的空格。由于它是一个数组,你可以将它的长度除以行数,如果它是一个分数(Math.ceil)则向上舍入,然后打印出这些单词。

接着?好吧,在那一步之后,你最终会得到一个尚未处理的原始字符串的剩余部分,并且还剩下许多行。所以你可以用截断的字符串和少一行来调用这个相同的函数。当行数为1(然后可以打印整个剩余的字符串)和/或空格数为0时,您就完成了(此处未进行测试;我想您可以先看看是否可以你有至少与空格一样多的空格 - 减1,如果没有,则发出错误。)

console.log(formatString('hello world blah blah blah', 2));

function formatString (string, numLines)
{
    var wordlist, trim_at, result;
    if (numLines < 2)
        return string;

    wordlist = string.match(/\S+\s*/g);
    trim_at = Math.ceil(wordlist.length/numLines);

    result = '';
    while (trim_at--)
        result += wordlist.shift();
    result += '\n';
    result += formatString (wordlist.join(''), numLines-1);
    return result;
}