#javascript #replace
#javascript #заменить
Вопрос:
У меня есть массив небольших строк, но я получил эти данные извне программы, поэтому я понятия не имею, как форматируются данные. В частности, я сталкиваюсь со многими ситуациями, когда у меня есть лишние пробелы до и после каждой строки.
Проблема в том, что у меня большой массив. Хотя я мог бы сделать что-то вроде этого:
for (var z = 0; z < myArray.length; z ) {
myArray[z] = myArray[z].replace(/(^s |s $)/g,'');
}
или
myArray.forEach(function(part, index) {
this[index] = this[index].replace(/(^s |s $)/g,'');
}, myArray);
Мне интересно, какой способ был бы лучшим, или это в значительной степени лучший? Есть ли пакетная функция для этого?
Комментарии:
1. Короче да, но лучше? Нет, не совсем.
2. почему бы не использовать
trim()
3. вы могли бы использовать
trim()
иlTrim()
только для обрезки пробелов в начале и конце строки, в противном случае придерживайтесь своего регулярного выражения, если вам также нужно обрезать внутри строки. с точки зрения оптимизации, быстрее всего вы получите, еслиwhile
цикл (немного быстрее, чем цикл for) будет работать в обратном направлении с уменьшающимся счетчиком до 0, в противном случае вы также можете использоватьmap
вместо foreach . в любом случае, если у вас есть что-то работающее, придерживайтесь этого, если это становится проблемой для производительности в главном потоке, загрузите это в рабочий процесс (будь то в node.js или в браузере, у вас есть варианты)4. @r3wt то, что обратный цикл while выполняется быстрее, является мифом, пока вы это не докажете.
5. @r3wt —
trim
выполняет обе стороны, в JavaScript этоtrimStart
иtrimEnd
(есть также более старые нестандартныеtrimLeft
иtrimRight
, которые официально являются псевдонимами в движках JavaScript в веб-браузерах). (В JS этого нетlTrim
.)
Ответ №1:
Два предложения:
- Вместо
replace
, в любом даже отдаленно современном браузере я бы использовалtrim
, который удаляет пробелы из начала и конца строки.trim
был добавлен в ES5 (2009). - Если массив не состоит из миллионов записей, я бы, вероятно, использовал
map
, но вашfor
цикл просто прекрасен.map
создает новый массив на основе результата функции обратного вызова.
Вот оба предложения, объединенные:
myArray = myArray.map(str => str.trim());
// or ES5:
myArray = myArray.map(function(str) { return str.trim(); });
Но если вы не хотите создавать новый массив, ваш for
с trim
просто отлично, хотя вы могли бы кэшировать myArray.length
, чтобы избежать повторного извлечения его на каждой итерации:
for (var i = 0, len = myArray.length; i < len; i) {
myArray[i] = myArray[i].trim();
}
(Я бы, вероятно, использовал let
вместо var
, если вы ориентируетесь на современные среды, поэтому i
и len
являются локальными для цикла. Современные движки сейчас хорошо оптимизируют это, чего раньше не всегда удавалось.)
Комментарии:
1. вам пришлось бы вернуться на некоторое время назад, чтобы потребовать полифайл для trim, я бы рекомендовал не включать его из-за раздувания.
2. @StevenStark — Я бы не стал беспокоиться о раздутии
trim
, но вы правы насчет того, как далеко назад вам пришлось бы зайти! Я неправильно запомнил, когда это было добавлено (я думал ES2015, а не ES5). Удалены все упоминания о полизаполнении. Только очень узкоспециализированное программное обеспечение должно поддерживать IE < 11 сейчас.3. У меня были проблемы с trim, фактически подбирая пробелы… это было очень раздражающе, и я понятия не имею, почему это происходило. Я посмотрел на ascii отдельных символов, и всех их было 32. Я буду продолжать работать над этим. Спасибо!