2012-06-24 53 views
3

我去砍文本到一個固定的長度,但我不想砍一半的話,所以我需要做這樣的事情:爲什麼我的話被切成兩半?

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 + "..."; 
} 

但當我這個使用它:

var str = "the quick brown fox jumped over the lazy dog"; 

for (var i = 0; i < 45; i++) { 
    document.write("i:" + i + " - " + fixedLength(str, i) + "<br>"); 
} 

每個人似乎除了這條線"i:43 - the quick brown fox jumped over the lazy do..."正常工作,守信用「狗」被對半斬(Demo

我找不到破綻,每次我改變一些東西的時候,我加入新bug

+5

對於其中一隻貓來說,它看起來非常可疑...... – tskuzzy

+3

對於那些懶得去查看編輯歷史的人來說,原來的標題是:「爲什麼我的狗被砍成兩半:(?」這是一部史詩標題。我很難過看到它已被編輯。:-( –

+0

這是否有幫助:http://jsfiddle.net/YXwfb/1/?基本上,這在len字符中查找最後一個單詞邊界。 – Kobi

回答

4

沒有檢查你的代碼,但你可以寫你的代碼更簡單:

function fixedLength(str, len, bol) { 
    while(!bol && str[len] && str[len] !== ' ') { 
     len--; 
    } 
    return str.substr(0, len) + '...'; 
} 

而且demo

+1

好吧,我的代碼根據位置截斷了單詞,如果它在這裏是'abXcde',那麼它不包括在內,但是'abcXde'等等,但是我認爲這個功能很愚蠢,我會簡單地使用你的解決方案。我的問題是要找到錯誤的來源,我認爲解決方案,使它不必修復錯誤也應該被接受,是啊...我接受這一點,謝謝 – ajax333221

+0

@ ajax333221是的,一個功能有一件事,KISS :) – xdazz

0
rtn = str.substr(0, ((Math.abs(left - tmp + 1) <= Math.abs(right - tmp)) ? left : right)); 

我沒有用調試器進行調試,但使用您的Demo是非常有幫助的。

0

我試圖重構你的代碼在一個非常易於理解的方式:

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); 
1

你可以嘗試使用正則表達式來找到最後的space字符。

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

演示在這裏:http://jsfiddle.net/R8qMQ/2/

我還添加了一個驗證,如果輸入字符串已經在允許的最大長度,返回它。如果沒有可以拆分的單詞,則返回一個空字符串而不是NULL。

我會用正則表達式,因爲我可以在未來添加其他字符,我可能會認爲它是單詞分隔符(例如.;或可能REGEX b - 單詞分隔符)。

+1

'<=長度'應該是'len'以防萬一不明顯 – ajax333221

+0

感謝您的糾正 –

1

如果您有興趣,您最初的代碼中的錯誤是在最後的賦值返回值,你比較tmp - 左和tmp - 右。問題是,在字符串中的最後一個單詞「dog」的情況下,在其初始值被設置爲l-1之後從不會被重新分配;所以你的算法行爲就好像在索引44處發現了一個空間,實際上在那裏有一個空格。

相關問題