繁体   English   中英

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

[英]Turning a string into a formatted paragraph in JavaScript

编辑:由于人们似乎有些困惑,我将尝试澄清。

本质上,您采用的字符串是可变的字符长度,并且可以是任意行。

顺利的是弦不必断字。 因此,作为另一个示例,字符串:

“跳狐”分为两行。 中间字符是“ u”,因此这两行将是:第1行:“跳跃中”第2行:“ Fox”以防止单词被截断。 这就是两个限制。

所以,我得到了这个问题:

给定单行文本String和最大行值,编写用于格式化输入文本的函数,即:根据字符均匀划分文本,并为字符串的每个部分返回新行。 但是请不要剪掉一行-即,如果您有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));

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

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"]

所提出的算法“您可以增加第一行的大小以捕获第500个字符中间的最后一个单词的末尾”具有致命的缺陷:如果您的最后一个单词长于length(sentence)/num_lines ,那么您跳到“下一个单词”,您会在该行中打印出过多的单词,最后在最后一行中显示的单词太少(可能根本没有)。

可以通过不将字符串视为字符序列 (需要检查每个字符以查看是否为空格),而不是将其视为单词序列来解决此问题 然后,算法是必须在每行上显示num_words/num_lines 使用Math.ceil进行四舍五入,以确保每行至少出现一个单词。

这样,您可以创建一个基本的测试用例,以精确地在2中拆分单词列表。拆分本身可以使用split函数完成,但是我更喜欢使用regex match ,因此保留了所有空格。 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM