Функция Split () для одного символа возвращает массив с 2 пустыми строками? - PullRequest
0 голосов
/ 13 февраля 2020

Я звоню split () для строки (на основе динамического / пользовательского ввода) и выполняю операцию с каждым элементом в возвращаемом массиве. Иногда у меня будет строка только с одним символом ('/'), и это приведет к неожиданным результатам (по крайней мере для меня).

Если я назову это так:

var randomString = '/';
var splitString = randomString.split('/');

splitString возвращает значение ["", ""]. Я ожидал получить только [""].

Есть ли причина, по которой я получаю 2 пустых строки в возвращаемом массиве? Я не мог найти документацию или примеры того, почему это происходит. Кроме того, если я хочу получить только одну пустую строку в этом примере, что будет лучшим способом? Просто удалить последнюю пустую строку?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Чтобы выяснить, почему метод делает то, что он делает, хорошая стратегия - подумать о том, как он реализован.

Я не знаю нативную реализацию метода split() для JS, но мне приходит в голову, что алгоритм перебирает строку в поисках пропущенного разделителя, сохраняет левую часть строки и затем продолжается до завершения.

Это элементарная версия функции разбиения с условием, что он соответствует разделителю из одного символа:

    function split(string, separator) {
      let substring = '';
      const results = [];
      // Iterate over the characters of the string
      for (let index = 0; index < string.length; index++) {
        const character = string[index];
        // Check if we found the separator
        if (character === separator) {
          // Save the current stored substring
          results.push(substring);
          // Set the new substring as empty
          substring = '';
        } else {
          // Add the character to the substring
          substring += character;
        }
      }
      results.push(substring);
      return results;
    }

Очевидно, что метод String.prototype.split() не реализован подобным образом, но я думаю, что он должен следовать той же логике c (с учетом более сложных разделителей, таких как как слова или регулярные выражения).

Я надеюсь, что это проясняет, почему возвращаемый результат - 2 пустые строки (в вашем случае), потому что:

  • substring начинается по умолчанию как пустая строка ("")
  • После нахождения separator, substring (который является пустой строкой) сохраняется в массиве results и затем устанавливается на пустую строку ng снова.
  • Наконец, после проверки всего string (в данном случае только 1 символ "/"), оставшиеся substring (также пустая строка) сохраняются в results.

ПРИМЕЧАНИЕ: split() не ограничивается массивом из двух элементов и потенциально может возвращать массив такой же длины исходной строки (например, при вызове его с пустым разделителем строк).

0 голосов
/ 13 февраля 2020

Есть ли причина, по которой я получаю 2 пустые строки в возвращенном массиве?

Строка разбивается на '/', поэтому .split () возвращает все, что было до, и после '/'.

Если бы строка была var randomString = 'Joe/Bill', то она вернула бы ["Joe", "Bill"].

В вашем случае нет символов до или после разделения, поэтому вы получите ["", ""].

Как сказал Уссейл, если вы затем добавите .filter(Boolean), тогда он удалит все пустые строки, оставив вас с пустым массивом [].

(.filter(Boolean) удалит все пустые строки из массива, см. Здесь: { ссылка })

Затем вы можете проверить это с помощью:

var randomString = '/';
var splitString = randomString.split('/');

// Remove any empty strings from the results
splitString = splitString.filter(Boolean);

if (splitString.length === 0) {
   // do something here
   //
   // This might be a special case so you might
   // want to handle it in a specific way
}
...