单个字符上的 Split() 函数返回一个包含 2 个空字符串的数组?



我正在对(基于动态/用户输入的(字符串调用split((,并对返回数组中的每个元素执行操作。偶尔我会有一个只有一个字符('/'(的字符串,这产生了一些意想不到的结果(至少对我来说(。

如果我称之为:

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

splitString返回值["", ""]。我预计只收到[""].

有什么原因让我在返回的数组中获得 2 个空字符串吗?我找不到任何文档或示例来说明为什么会发生这种情况。此外,如果我想在这个例子中只接收一个空字符串,最好的方法是什么?只是删除最后一个空字符串?

谢谢

有什么原因让我在返回的数组中获得 2 个空字符串吗?

字符串在'/'处被拆分,所以 .split(( 返回'/'之前和之后的任何内容。

如果字符串var randomString = 'Joe/Bill'则返回["Joe", "Bill"]

在您的情况下,拆分之前或之后都没有字符,因此您可以["", ""].

正如 Oussail 所说,如果您随后添加.filter(Boolean)那么它将删除所有空字符串,让您[]留下一个空数组。

(.filter(Boolean)将从数组中删除任何空字符串,请参阅此处:https://stackoverflow.com/a/54623591/12825520(

然后,您可以使用以下方法进行检查:

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
}

要弄清楚为什么该方法会这样做,一个好的策略是考虑它是如何实现的。

我不知道 JS 的split()方法的本机实现,但我突然想到该算法遍历字符串以查找传递的分隔符,存储字符串的左侧部分,然后继续直到完成。

这是拆分函数的基本版本,条件是它与单个字符分隔符匹配:

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()方法不是这样实现的,但我认为它应该遵循相同的逻辑(注意考虑更复杂的分隔符,例如单词或正则表达式(。

我希望这能澄清为什么返回的结果是 2 个空字符串(在您的情况下(,因为:

  • 默认情况下,substring以空字符串 (""( 开头
  • 找到separator后,substring(这是一个空字符串(被保存到results数组中,然后再次设置为空字符串。
  • 最后,在检查整个string(在本例中为仅 1 个字符"/"(后,剩余的substring(也是一个空字符串(将保存到results中。

注意:split()不限于双元素数组,并且可能返回与原始字符串长度相同的数组(例如,使用空字符串分隔符调用它时(。

相关内容

最新更新