Javascript — как заменить пробелы во всем массиве

#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. Я буду продолжать работать над этим. Спасибо!