我有以下while循环作为我的文本对齐函数的一部分。我的想法是,我需要对齐文本字符串(str
)(在单词之间添加到现有空格的空格)等于给定长度(len
)
我只能在迭代到字符串中的下一个空格并在那里添加另一个空格之前,一次只能向现有空间添加一个空格。如果它对于字符串中的所有空格而言仍然没有达到所需的长度,我会循环回原始空间(现在是两个空格)并添加另一个空格。然后它进入单词之间的下一个空格,依此类推。我们的想法是,字符串中单词之间的任何空格都不应有多于一个空格的差异(即Lorem---ipsum--dolor--sit
,而不是Lorem----ipsum--dolor-sit
)
从我的研究中,我决定使用原始字符串的substring
方法添加第一个额外空格,然后我将增加索引并移动到字符串中的下一个空格并重复添加。这是我的代码:
var indexOf = str.indexOf(" ", 0);
if ( indexOf > -1 ) {
while ( indexOf > -1 && str.length < len ) {
//using a regexp to find a space before a character
var space = /\s(?=\b)/.exec(str);
str = str.substring(0, indexOf + 1) + " " + str.substring(indexOf + 1);
//go to next space in string
indexOf = str.indexOf(space, indexOf + 2);
if ( indexOf === -1 ) {
//loops back to beginning of string
indexOf = str.indexOf(space, 0);
}
}
}
finalResults.push(str);
此代码大部分时间都有效,但我注意到有些情况下间距的循环不正确。例如,它生成以下字符串:
sit----amet,--blandit
当正确的迭代将是
sit---amet,---blandit
任何协助使这段代码在字符串中的每个空格(以添加一个空格)上正确迭代一次,然后循环回到字符串的开头以重新开始直到达到所需的长度将是非常感激的。< / p>
答案 0 :(得分:1)
我认为计算开头所需的数字空间效率更高。
var s = "today is a friday";
var totalLength = 40;
var tokens = s.split(/\s+/);
var noSpaceLength = s.replace(/\s+/g,'').length;
var minSpace = Math.floor((totalLength - noSpaceLength)/(tokens.length-1));
var remainder = (totalLength - noSpaceLength) % (tokens.length-1);
var out = tokens[0];
for (var i = 1; i < tokens.length; i++) {
var spaces = (i <= remainder ? minSpace+1 : minSpace);
out += "-".repeat(spaces) + tokens[i];
}
$('#out').text(out);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="out"></div>
&#13;
答案 1 :(得分:1)
此解决方案
s
)拆分为数组中的字词(a
)add
)rem
)add
没有用尽,则rem
个空格加上一个代码
var s = "Caballo sin Nombre"; // assume one space between words
var len = 21; // desired length
var need = len - s.length;
var a = s.split(/ /); // split s
// need>0 and at least two words
if (need > 0 && a.length>1) {
var add = Math.floor(need / (a.length-1)) + 1; // all spaces need that (+existing)
var rem = need % (a.length-1); // remainder
var sp = '';
while (add-- > 0) sp += ' ';
// replace
var i,res = ''; // result
for (i=0 ; i<a.length-1 ; i++) {
res += a[i] + sp;
if (rem-- > 0) res += ' '; // remainder
}
res += a[i];
s = res;
}
console.log("'" + s + "' is " + s.length + " chars long.");
答案 2 :(得分:1)
此函数使用全局替换添加空格,小心限制文本大小。
function expand (txt, colwidth) {
txt = txt.replace (/\s\s+/, ' '); // Ensure no multiple spaces in txt
for (var spaces = ' ', // Spaces to check for
limit = colwidth - txt.length; // number of additional spaces required
limit > 0; // do while limit is positive
spaces += ' ') // add 1 to spaces to search for
txt = txt.replace (RegExp (spaces, 'g'),
function (r) {
// If limit > 0 then add a space else do not.
return limit > 0 && --limit ? r + ' ' : r
});
return txt;
}
for (var w = 21; w--;) console.log (expand ('this is a test.', w));
在控制台上显示:
this is a test.
this is a test.
this is a test.
this is a test.
14 this is a test.