字符串分割返回了比预期更多的数组元素(空元素)

59

我不明白这种行为:

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如何工作?

有没有其他方法可以做到这一点?


是的,我真的很讨厌必须省略结尾分隔符。当尝试编写一致的代码或值或编辑严格类型的JSON时,这非常令人恼火。 - oriadam
11个回答

105
您可以添加一个过滤器来排除空字符串。
var string = 'a,b,c,d,e:10.';
var array = string.split ('.').filter(function(el) {return el.length != 0});

5
请注意,filter() 是 ECMAScript 5 数组函数,如果你的浏览器不支持该功能,则需要添加额外的代码才能使用。请参考 此处 获取更多信息和实现此方法所需的代码。 - Mark Walters
14
此答案应该被接受,因为它解决了问题并返回预期的结果,而不是链接到某些文档。 - MrCroft

49

这是一个稍微简单一些的版本,用于排除空字符串(使用 ES6 箭头函数),参考自 @xdazz 的版本

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

29

这是正确和预期的行为。由于您在字符串中包含了分隔符,因此拆分函数(简化版)将左侧的部分(“a,b,c,d,e:10”)作为第一个元素,将分隔符右侧的部分(一个空字符串)作为第二个元素。

如果您真的对split()如何工作感到好奇,可以查看ECMA规范(ECMA 262)148和149页,网址为http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf


6
这是方法规范的直接链接: http://es5.github.com/#x15.5.4.14。 - Felix Kling
"split函数将分隔符左侧的部分作为第一个元素。" - 这解释了为什么会这样发生。 - Avatar

19
使用 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


4

这只是返回一个字符串 "a,b,c,d,e:10",而不是一个数组,这就是为什么长度为1的原因。 - caseyjhol
嗨@caseyjhol,字符串的长度将是12而不是1。调用split总是返回一个数组,因此长度为1。我在这里的意图是展示调用split('.')返回长度为1的数组。我的答案是正确的。 - chim
1
你是对的 - 我误读了原始问题,并认为他试图使用逗号作为分隔符将其转换为数组。 - caseyjhol

1

这是因为字符串以.字符结尾 - 数组的第二个项目为空。

如果字符串根本不包含.,则将得到所需的一个项目数组。

split()方法的工作原理如下:

  1. 在给定字符串中查找要拆分的字符串。如果未找到,则返回带有整个字符串的一个项目数组。
  2. 如果找到,迭代给定字符串,取出每两个要拆分的字符串之间的字符。
  3. 如果给定字符串以要拆分的字符串开头,则结果数组的第一项为空。
  4. 如果给定字符串以要拆分的字符串结尾,则结果数组的最后一项为空。

更详细的技术解释可以在这里找到,对于所有浏览器来说基本相同。


1
根据MDN web docs,当字符串为空时,split()返回一个包含一个空字符串的数组,而不是空数组。如果字符串和分隔符都为空字符串,则返回一个空数组。
const myString = '';
const splits = myString.split();

console.log(splits); 

// ↪ [""]

0

因为您的字符串由两部分组成:

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

2:空

如果您尝试不带句点结尾:

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

输出结果为:

["a,b,c:10"]

0

好的,split函数会按照指定的分隔符将字符串进行分割。只是第二部分为空。


0

你有一个包含一个“.”的字符串,当你使用string.split('.')时,你会得到一个数组,其中第一个元素包含“.”字符之前的字符串内容,第二个元素包含“.”之后的字符串内容 - 在这种情况下为空字符串。

所以,这种行为是正常的。你想通过使用这个string.split来实现什么目的呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接