String split возвращает массив с двумя элементами вместо одного

Я не понимаю этого поведения:

var string = 'a,b,c,d,e:10.';
var array = string.split ('.');

Я ожидаю этого:

console.log (array); // ['a,b,c,d,e:10']
console.log (array.length); // 1

но я получаю это:

console.log (array); // ['a,b,c,d,e:10', '']
console.log (array.length); // 2

Почему два элемента возвращаются вместо одного? Как работает split?

Есть ли другой способ сделать это?

Ответ 1

Это правильное и ожидаемое поведение. Учитывая, что вы включили разделитель в строку, функция split (упрощенная) занимает часть слева от разделителя ( "a, b, c, d, e: 10" ) как первый элемент, а часть остальную часть разделителя (пустую строку) в качестве второго элемента.

Если вам действительно интересно, как работает split(), вы можете просмотреть страницы 148 и 149 спецификации ECMA (ECMA 262) в http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Ответ 2

Вы можете добавить фильтр, чтобы исключить пустую строку.

var string = 'a,b,c,d,e:10.';
var array = string.split ('.').filter(function(el) {return el.length != 0});

Ответ 3

Немного более простая версия @xdazz версии для исключения пустых строк (с помощью ES6 arrow function):

var array = string.split('.').filter(x => x);

Ответ 4

Используйте метод String.split() с методом Array.filter().

var string = 'a,b,c,d,e:10.';
var array = string.split ('.').filter(item => item);

console.log(array); // [a,b,c,d,e:10]
console.log (array.length); // 1

Ответ 6

Это потому, что строка заканчивается символом . - второй элемент массива пуст.

Если строка не будет содержать . вообще, у вас будет нужный массив элементов.

Метод split() работает так, насколько я могу объяснить простыми словами:

  • Посмотрите на данную строку, которая будет разделяться в данной строке. Если не найден, верните один массив элементов со всей строкой.
  • Если найдено, повторите эту строку, взяв символы между каждыми двумя вхождениями строки для разделения.
  • В случае, если заданная строка начинается с разделимой строки, первый элемент массива результатов будет пустым.
  • Если заданная строка заканчивается разделяемой строкой, последний элемент массива результатов будет пустым.

Здесь более технически описано здесь, это почти то же самое для всех браузеров.

Ответ 7

так; [String.prototype] split(separator, limit) Возврат к нормальному предельному параметру пуст.

"".split(",") // [""]

"a,b,c.".split(".", 1) // ["a,b,c"]

Если бы вы тоже этого не сделали, без предельного параметра. Я думаю, что это обычная операция...

Ответ 8

Ну, split делает то, что он сделал, он разбивает вашу строку. Просто, что вторая часть раскола пуста.

Ответ 9

Поскольку ваша строка состоит из 2 частей:

1: a, b, c, d, e: 10

2: empty

Если вы попытаетесь без точки в конце:

var string = 'a,b,c:10';
var array = string.split ('.');

:

["a,b,c:10"]

Ответ 10

У вас есть строка с одним "." в нем, и когда вы используете string.split('.'), вы получаете массив, содержащий первый элемент со строковым содержимым до "." . символ и второй элемент с содержимым строки после "." - в этом случае пустая строка.

Итак, это нормально. Что вы хотите достичь, используя этот string.split?

Ответ 11

Согласно веб-документам MDN:

Примечание. Когда строка пуста, split() возвращает массив, содержащий одна пустая строка, а не пустой массив. Если строка и разделитель - пустые строки, возвращается пустой массив.

const myString = '';
const splits = myString.split();

console.log(splits); 

// ↪ [""]

Ответ 12

попробуйте это

javascript дает два массива с помощью функции split, затем

var Val = "[email protected]";
var mail = Val.split('@');

if(mail[0] && mail[1])  {   alert('valid'); }
else    {   alert('Enter valid email id');  valid=0;    }

если оба массива содержат длину больше 0, тогда условие будет истинным