Как лучше всего обрезать () в javascript

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

Спасибо за все отличные ответы. Я не думаю, что есть один ответ, который значительно лучше, чем все остальные, поэтому могу ли я оставить это на усмотрение демократии вместо «Принять ответ»?

MDCore 13.10.2008 11:43

Демократия будет решаться подсчетом голосов, но вы все равно можете выбрать тот, который вы использовали в конце, в качестве ответа на вашу проблему - это две немного разные концепции.

John K 17.07.2010 06:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
40
2
44 366
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

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

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

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

Согласно связанной странице, единственная разница между \ s + и \ s \ s * заключается в том, что последний работает немного быстрее.

Pat 30.10.2008 12:45

Если вы читаете дальше, модифицированный trim11, упомянутый в конце статьи, является лучшим методом для более длинных струн.

Chris MacDonald 30.10.2008 14:48

Это старый поток, и пока что встроенная обрезка реализована в Javascript. Регулярное выражение Пэта, а также упомянутый Крисом Макдональдом trim11 очень медленные, а также jquery trim медленный в некоторых браузерах (jsperf.com/mega-trim-test/16). Здесь можно найти гораздо более быструю реализацию обрезки: stackoverflow.com/a/12547889/1691517.

Timo Kähkönen 29.09.2012 15:05

Ответ на многие вопросы о JavaScript: jQuery

$j.trim(string)



Примечание: приведенное выше предполагает, что ваш jQuery настроен с помощью:

<script type = "text/javascript">$j = jQuery.noConflict();</script>

Это гораздо более разумно, чем "$", и гораздо менее многословно, чем каждый раз вводить "jQuery".

Объект jQuery. Намного разумнее, чем просто использовать $. <script type = "text / javascript" src = "jquery.js"> </script> <script type = "text / javascript"> $ j = jQuery.noConflict (); </script>

Peter Boughton 30.10.2008 10:48

Почему $j более разумно, чем $?

Ben 22.08.2014 12:19

Немного более маленькая версия @ Pat's.

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

Я думаю, вам нужно выполнить это для текста в вызове вашего метода. ;)

J c 13.10.2008 13:10

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

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

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

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

Для обрезки:

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

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

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

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

Собственно, с jQuery, похоже, так:

jQuery.trim(string)

(Справка)

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

string = $.trim(string);

Связь

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

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

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

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

Флаг g бесполезен без флага m.

Alin Purcaru 15.12.2010 19:27

Microsoft .NET также имеет функцию String.trim как часть расширений базового типа JavaScript. Его можно использовать, если вы пишете приложение ASP.NET.

Почему бы просто не изменить прототип 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

Я использую это.

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

Используйте Функция быстрой обрезки Ariel Flesler:

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

вы шутите? он не может быть быстрым, так как он использует множество функций внутри

Jasper 09.01.2014 21:47

Я использую это:

Работа с функциями.

 function trim($) { 
                return (typeof $ == "function" ? $() : $).replace(/[\s]*/g,"")
        }

        code example: 

        trim((function(){ return "a  b"})) // ab

        trim(" a  b") //ab

Вы можете использовать следующие ...

function trim(str) {
    try {
        if (str && typeof(str) == 'string') {
            return str.replace(/^\s*|\s*$/g, "");
        } else {
            return '';
        }
    } catch (e) {
        return str;
    }
}

Я задумал скорость с функцией триммирования. Эта функция явно превосходит всех 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", но легко добавить больше пробельных символов, например. те, которые регулярное выражение использует как пробелы, с незначительной потерей производительности (см. 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, что составляет ZERO WIDTH NO-BREAK SPACE.
  • Обеспечивает единообразие результатов обрезки в разных браузерах.
  • Использует собственный trim (), если он доступен, И имеет возможность обрезать все 27 различных пробелов. Исключением являются Chrome и Chromium, которые имеют настолько медленную встроенную обрезку (), что вместо встроенной мы используем нашу настраиваемую обрезку.
  • И САМОЕ ВАЖНОЕ: не красиво и не коротко, но ЯВНО БЫСТРЕЕ, чем любая из 24 конкурентных альтернатив в http://jsperf.com/mega-trim-test/12 (исключение: довольно старый Firefox 3.6.25 в Windows 7 запускает mytrim () довольно медленно по неизвестной причине).

Это, вероятно, не самый быстрый и может нарушать то, что, вероятно, действительно должно быть ".trim ()", но мне не нравятся регулярные выражения (в основном потому, что требуется так много времени, чтобы понять, что они на самом деле означают / делают), и мне нравится иметь что-то, что, как я знаю, будет работать независимо от того, есть ли у меня jQuery или нет (не говоря уже о правильной версии, поскольку я пробовал $ .trim (myVar) с jQuery 1.4.2, и он не работает), и избавлюсь от ВСЕХ лишние пробелы, а не только в конце, перестраивая его так, как должно быть:

function Trim(obj) {
    var coll = "";
    var arrObj = obj.split(' ');

    for (var i=0;i<arrObj.length;i++) {
        if (arrObj[i] == "") {
            arrObj.splice(i,1);  // removes array indices containing spaces
        }
    }
    //alert(arrObj.length);  // should be equal to the number of words
    // Rebuilds with spaces in-between words, but without spaces at the end
    for (var i=0;i<arrObj.length;i++) {
        if (arrObj[i] != "" && i != arrObj.length-1)
            coll += arrObj[i] + " ";
        if (arrObj[i] != "" && i == arrObj.length-1)
            coll += arrObj[i];
    }

    return coll;
}
Ответ принят как подходящий

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

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

Ты прав! Родной всегда лучше. Это только от IE9 и выше, но через несколько лет это тоже не будет иметь большого значения.

MDCore 18.05.2014 19:51

@MDCore спасибо, что приняли мой ответ и упомянули минимальную версию IE. Но что вы имеете в виду, когда говорите, что через несколько лет это не будет иметь значения, вы говорите, что javascript устареет?

K. R. 19.05.2014 20:52

@KR Итак, я задал этот вопрос пять с половиной лет назад. С тех пор trim () стал стандартной функцией. Я решил просто указать, что мы почти в плане поддержки IE, но через пять с половиной лет это будет спорным. Я бы предпочел, чтобы люди использовали собственные функции и использовали один из многих других ответов, если они застряли в IE8.

MDCore 20.05.2014 01:34

Это старый вопрос, но у меня ни один из них не помог. Мне просто нужно было обрезать начальное и конечное белое пространство, что я и сделал. У моего тега div был id = start-date.

$("#start-date").text().trim()

"Это старый вопрос, но у меня ни один из них не помог." Правда? Даже родная отделка салона, упомянутая К.?

Franklin Yu 18.04.2018 19:55

Я использую это с собственным JavaScript

// Adding trim function to String object if its not there
if (typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
  }
}

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

var myString = "                  some text                  ";

alert(myString.trim());

Пример

// Adding trim function to String object if its not there
if (typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
  }
}

var str = "      some text              ";
console.info(str.trim());

Другие вопросы по теме