我正在对(基于动态/用户输入的(字符串调用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()
不限于双元素数组,并且可能返回与原始字符串长度相同的数组(例如,使用空字符串分隔符调用它时(。