Каков наилучший способ обрезки () в JavaScript - PullRequest
40 голосов
/ 13 октября 2008

Вопрос говорит сам за себя; JS, похоже, не имеет встроенного метода trim ().

Ответы [ 19 ]

41 голосов
/ 30 октября 2008

Самая короткая форма для jQuery:

string = $.trim(string);

Ссылка

31 голосов
/ 13 октября 2008

согласно этой странице лучший универсальный подход -

return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');

Конечно, если вы используете jQuery, он предоставит вам оптимизированный метод обрезки.

18 голосов
/ 30 октября 2008

Ну, как всегда говорят многие, функция обрезки работает довольно хорошо, но если вы не хотите использовать весь фреймворк просто для выполнения обрезки, может быть полезно взглянуть на его реализацию. Итак, вот оно:

function( text ) { return (text || "").replace( /^(\s|\u00A0)+|(\s|\u00A0)+$/g, "" );}

Основные преимущества, которые я вижу в этой реализации, по сравнению с другими решениями, уже предложенными здесь:

  • Флаг 'g', позволяющий вам выполнить обрезку многострочной строки
  • Синтаксис (text || ""), который гарантирует, что функция будет работать всегда, даже если переданный аргумент является нулевым или неопределенным.
17 голосов
/ 18 мая 2014

Я знаю, что этот вопрос древний, но теперь у Javascript действительно есть собственный .trim ()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

8 голосов
/ 13 октября 2008

Как уже отметили несколько других, обычно лучше всего делать подобные вещи с помощью сторонней библиотеки JS. Не так, что trim () - это сложная функция для самостоятельного создания, но есть так много функций, которые не являются родными для JavaScript, что вам может понадобиться, и в итоге вы сами напишите, что вскоре использование библиотеки станет более рентабельным.

Конечно, еще одно преимущество использования библиотеки JS состоит в том, что авторы выполняют тяжелую работу по обеспечению того, чтобы функции работали во всех основных браузерах, чтобы вы могли кодировать в стандартный интерфейс и забыть о раздражающих различиях в Интернете Explorer и все остальные браузеры.

7 голосов
/ 13 октября 2008

Немного крошечная версия @ Pat's.

return str.replace( /^\s+|\s+$/g, '' );
6 голосов
/ 13 октября 2008

Для ltrim замените пробелы, закрепленные в начале строки, ничем:

str2 = str.replace(/^\s+/,'');

Для rtrim замените пробелы, закрепленные в конце строки, ничем:

str2 = str.replace(/\s+$/,'');

Для отделки:

str2 = str.replace(/^\s+|\s+$/g,'');

Все они используют регулярные выражения для выполнения реальной работы.

5 голосов
/ 13 декабря 2008

Почему бы просто не изменить прототип String? Почему бы не украсть функцию обрезки из библиотеки с открытым исходным кодом, как я делал здесь с YUI? (Вам действительно нужно загрузить и весь фреймворк для этих простых задач?) Соедините их вместе, и вы получите следующее:

String.prototype.trim = function() {
    try {
        return this.replace(/^\s+|\s+$/g, "");
    } catch(e) {
        return this;
    }
}

var s = " hello ";
alert(s.trim() == "hello"); // displays true
5 голосов
/ 20 октября 2009

Использование Функция быстрой настройки Ариэля Флезлера :

// Licensed under BSD
function myBestTrim( str ){
 var start = -1,
  end = str.length;
 while( str.charCodeAt(--end) < 33 );
 while( str.charCodeAt(++start) < 33 );
 return str.slice( start, end + 1 );
};

Мое решение, однако, было бы следующим (потому что объект String в Firefox 3.5 и выше уже имеет trim метод ):

String.prototype.trim = String.prototype.trim || function () {
    var start = -1,
        end   = this.length;

    while( this.charCodeAt(--end) < 33 );
    while( this.charCodeAt(++start) < 33 );

    return this.slice( start, end + 1 );
};
4 голосов
/ 23 сентября 2012

Я учел скорость тримминга. Эта функция явно отличается от всех 24 конкурентов (многие из которых используют регулярные выражения), а также от родных string.trim () Chrome и Chromium (!) И работает так же быстро, как trim () Safari. Результаты теста здесь: http://jsperf.com/mega-trim-test/7

function trim27(str) {
  var c;
  for (var i = 0; i < str.length; i++) {
    c = str.charCodeAt(i);
    if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
    continue; else break;
  }
  for (var j = str.length - 1; j >= i; j--) {
    c = str.charCodeAt(j);
    if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
    continue; else break;
  }
  return str.substring(i, j + 1);
}

Функция обрезает символы "\ n \ r \ t \ f", но легко добавить больше пробельных символов, например. те, которые regexp использует в качестве пробелов (\ s) с небольшой потерей производительности (см. http://jsperf.com/mega-trim-test/8).

Редактировать: предыдущий trim27 () обрезает только самые распространенные символы ("\ n \ r \ t \ f"), но чтобы обрезать все возможные пробелы, я включил ниже новую функцию mytrim ():

if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
    var mytrim = function(str) {
        var c;
        for (var i = 0; i < str.length; i++) {
            c = str.charCodeAt(i);
            if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
            continue; else break;
        }
        for (var j = str.length - 1; j >= i; j--) {
            c = str.charCodeAt(j);
            if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
            continue; else break;
        }
        return str.substring(i, j + 1);
    };
    else var mytrim = function(str) {
        return str.trim();
    }

Используйте это так:

var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"

Вышеупомянутый mytrim () выполняет следующие действия:

  • Обрезает 26 различных пробелов (все из 25 пробелов, упомянутых в http://perfectionkills.com/whitespace-deviations/ и дополнительно uFEFF, который является НУЛЕВОЙ ШИРИНОЙ без пробела.
  • Обеспечивает согласованность результатов обрезки в разных браузерах.
  • Использует встроенную обрезку (), если она доступна И имеет возможность обрезать все 27 различных пробелов. Исключением являются Chrome и Chromium, которые имеют настолько медленную встроенную отделку (), что вместо встроенной мы используем нашу собственную отделку.
  • И САМОЕ ВАЖНОЕ: Это не красиво и не коротко, но ЯВНО БЫСТРЕЕ, чем любая из 24 конкурентных альтернатив в http://jsperf.com/mega-trim-test/12 (исключение: довольно старый Firefox 3.6.25 в Windows 7 запускает mytrim () довольно медленно по неизвестной причине).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...