Javascript 为什么我的话被一分为二?
我正在尝试将文本切碎为固定长度,但我不想将单词切碎一半,因此我需要执行以下操作:Javascript 为什么我的话被一分为二?,javascript,string,chop,Javascript,String,Chop,我正在尝试将文本切碎为固定长度,但我不想将单词切碎一半,因此我需要执行以下操作: function fixedLength(str, len, bol) { var i, l = str.length, left = 0, right = l - 1, rtn, tmp; tmp = str.charAt(len); if (bol || tmp === " " || tmp === "") { rtn = str.substr(0, len);
function fixedLength(str, len, bol) {
var i, l = str.length, left = 0, right = l - 1, rtn, tmp;
tmp = str.charAt(len);
if (bol || tmp === " " || tmp === "") {
rtn = str.substr(0, len);
} else {
tmp = len - 1;
for (i = tmp; i > -1; i--) {
if (str.charAt(i) === " ") {
left = i;
break;
}
}
for (i = tmp; i < l; i++) {
if (str.charAt(i) === " ") {
right = i;
break;
}
}
rtn = str.substr(0, ((Math.abs(left - tmp) <= Math.abs(right - tmp)) ? left : right));
}
return rtn + "...";
}
函数固定长度(str、len、bol){
变量i,l=str.length,左=0,右=l-1,rtn,tmp;
tmp=str.charAt(len);
如果(bol | | tmp==“”| | tmp==“”){
rtn=str.substr(0,len);
}否则{
tmp=len-1;
对于(i=tmp;i>-1;i--){
如果(str.charAt(i)==“”){
左=i;
打破
}
}
对于(i=tmp;i rtn=str.substr(0,((Math.abs(left-tmp)rtn=str.substr(0,((Math.abs(left-tmp+1))我试图以一种非常容易理解的方式重构代码:
function prettyCut(word, length) {
//account for ellipses
length -= 3;
//break down into lengths
var units = word.split(" ").map(function(word) {
return word.length+1;
});
//map to accumulated sums
var runningSum = 0;
var sums = units.map(function(length, index) {
return (runningSum += length)
});
//find difference from goal of each sum
var differences = sums.map(function(sum) {
return (length-sum)>0?(length-sum):100;
});
//minimize and return
var closest = Math.min.apply(this, differences);
return closest==0?word:word.substr(0, length-closest)+"...";
}
prettyCut("the quick brown fox jumped over the lazy dog", 45);
没有检查代码,但您可以编写更简单的代码:
function fixedLength(str, len, bol) {
while(!bol && str[len] && str[len] !== ' ') {
len--;
}
return str.substr(0, len) + '...';
}
还有。您可以尝试使用regex查找最后一个空格
字符
function fixedLength(str, len, bol) {
if(str.length <= len) {
return str;
}
var rtn = str.substr(0, len).match(/.* /);
if(rtn == null) {
rtn = "";
} else {
rtn = rtn + "...";
}
return rtn;
}
函数固定长度(str、len、bol){
如果(str.length,如果您感兴趣,则原始代码中的错误出现在返回值的最终赋值中,在这里您比较了tmp-left和tmp-right。问题是字符串中的最后一个单词“dog”,在其初始值设置为l-1后,不会重新分配右侧;因此,您的算法就像在索引44处发现了一个空格,而实际上那里有一个g。首先,您的坟墓中的猫看起来非常可疑……对于那些懒得检查编辑历史的人来说,最初的标题是:“为什么我的狗被切成两半:(?”这是一个史诗般的标题。看到它被编辑,我很难过-(这有什么帮助吗:?基本上,这是在len
字符中查找最后一个单词边界。好吧,我的代码根据位置切掉了这个单词,如果它在这里abXcde
它没有被包括在内,但是abcXde
它是,等等。但是我认为这个功能很愚蠢,我只会使用你的解决方案。虽然我的问题是为了找到错误的来源,我认为一个解决方案,使它不必修复错误,也应该被接受的候选人,是的…我接受这个,thanks@ajax333221是的,一个函数做一件事,KISS:)
function fixedLength(str, len, bol) {
while(!bol && str[len] && str[len] !== ' ') {
len--;
}
return str.substr(0, len) + '...';
}
function fixedLength(str, len, bol) {
if(str.length <= len) {
return str;
}
var rtn = str.substr(0, len).match(/.* /);
if(rtn == null) {
rtn = "";
} else {
rtn = rtn + "...";
}
return rtn;
}