[英]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.