Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的话被一分为二?_Javascript_String_Chop - Fatal编程技术网

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;irtn=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;
}