2010-10-26 2 views
2

Я только что написал функцию limitChars().Можно ли улучшить функцию limitChars?

var limitChars = function(str, limit, endChar, preserveWord) { 
    str = $.trim(str); 
    var strLength = str.length; 
    if (strLength <= limit) { 
    return str; 
    } 

    if (limit == 0) { 
    return ''; 
    } 

    endChar = endChar || '…'; 

    if (preserveWord && ! str.substr(limit, 1).match(/\s/)) { 
    while (limit < strLength && ! str.substr(limit, 1).match(/\s/)) { 
     limit++; 
    } 
    } 

    return $.trim(str.substr(0, limit)) + endChar;  
} 

Для целей обучения, я люблю post my solution здесь и посмотреть, если кто-нибудь может улучшить его (и я часто нахожу, что я что-то упускается из виду, и все мы учимся :))

Итак, скажи мне, где Я могу улучшить этот кусок кода, пожалуйста :)

(oh Я использую jQuery's $.trim(), но если вы хотите использовать более специфичные функции jQuery, не стесняйтесь).

+0

что делает функция? – Anurag

+0

Зачем использовать jQuery для простой функции ограничения символов. Вы должны на самом деле рассмотреть vanilla javascript для этого :) – Sarfraz

+0

@Sarraz Ну мне нужна * реализация * 'trim()'. Может также использовать jQuery один, как это уже в моей среде. – alex

ответ

1

Поскольку indexOf принимает необязательный второй аргумент fromIndex, мы можем реализовать функцию как таковую:

function limitChars(str, limit, endChar, preserveWord) { 
    str = $.trim(str); 
    return (str.length > limit) ? str.substring(0, (preserveWord ? str.indexOf(' ', limit) : limit)) + (endChar || '…') : str; 
} 

Много менее читаемым, но я думаю, вы получите идею. :)

Edit: Я просто понял, что я пропустил часть оригинального сценария, который будет добавлять endChar только если длина строки больше, чем limit. Время для другого тернарного оператора!

0

Мы можем просто сделать внизу справа

function ShortentText(text, limit) { 

var temp; 
if (text.length - 1 > limit) { 
    temp = text.substring(0, limit-3) + '...'; 
} 
else { 
    temp = text; 
} 
return temp; 

}

+0

Я хочу сказать, не вычеркнув какие-либо черты моей :) Мина также предположила, что конечный шар будет дополнительным после обрезания. Кроме того, можно использовать многоточие Unicode. – alex

0

Я не знаю, если это лучшее решение, но это также будет работать:

var limitChars = function(str, limit, endChar, preserveWord) { 
    if($.trim(str).length<limit) 
return $.trim(str); 
    else if(!preserveWord) 
return $.trim(str).substr(0,limit).concat(endChar||'…'); 
    else { 
    var strArr = $.trim(str).split(" "); 
    var i=-1; 
    var retStr = ""; 
    while(i+1<strArr.length && retStr.concat(" ", strArr[i+1]).length < limit) 
    retStr = retStr.concat(" ", strArr[++i]); 
    return retStr.concat(endChar|| '…'); 
    } 
} 

Кроме того, я добавит параметры по умолчанию.

+0

Спасибо за ваш ответ. Однако JavaScript [не разрешает] (http://jsbin.com/ujaro) параметры по умолчанию, подобные этому. Я предоставляю параметры по умолчанию - эллипсис для 'endChar' и значение * falsy * (' undefined') для 'preserveWord'. Я также пытался избежать пересчета 'length' для каждой итерации. – alex

+0

О, спасибо, я этого не осознавал. – Aspelund

Смежные вопросы