javascript - JS For循环在while循环中返回奇怪的结果
问题描述
我正在尝试拆分一个字符串并根据它的索引组合它。一个简单的例子是:
输入:“ABCABCABC” 输出:“AAABBBCCC”
因此,我创建了一个将字符串转换为数组的函数,将元素弹出到相应的数组中,并希望将其组合回字符串。
这是功能:
function splitter(string, numSplit) {
let splitHolder = [];
let splitArr = string.split("");
while (splitArr.length > 0) {
for (let i = 0; i < numSplit; i++) {
splitHolder[i] = splitHolder[i] === undefined
? [splitArr.shift()]
: splitHolder[i].push(splitArr.shift());
console.log(splitHolder);
}
}
}
console.log 的结果显示:
[ [ 'A' ] ]
[ [ 'A' ], [ 'B' ] ]
[ [ 'A' ], [ 'B' ], [ 'C' ] ]
这表明该函数至少在第一个循环中运行良好。但是,在 for 循环的第二遍中,在 while 检查之后。我得到这个日志:
[ 2, [ 'B' ], [ 'C' ] ]
[ 2, 2, [ 'C' ] ]
[ 2, 2, 2 ]
这很奇怪,因为我仍在尝试推动阵列的剩余部分?数字 2 是从哪里来的?
最初认为这是一个范围问题,但并不是因为 let 是针对整个函数的范围。
还尝试了数组减少功能,但仍然得到相同的数字 2。
解决方案
你可以Array#concat
代替Array#push
.
concat
返回一个新数组和数组push
的新长度。
function splitter(string, numSplit) {
let splitHolder = [];
let splitArr = string.split("");
while (splitArr.length) {
for (let i = 0; i < numSplit; i++) {
splitHolder[i] = splitHolder[i] === undefined
? [splitArr.shift()]
: splitHolder[i].concat(splitArr.shift());
}
}
return splitHolder;
}
console.log(splitter('ABCABCABC', 3));
推荐阅读
- rest - 将空 REST 数据转换为日期时间时如何避免错误
- javascript - 检测浏览器,不加载 HTML,cshtml cSharp
- php - Laravel - Auth::attempt 不返回正确的响应
- python - 当我从函数返回一个字符串时,它有逗号吗?
- python - 损坏的 DAG:urllib3 1.25.3 (/home/ubuntu/.local/lib/python3.7/site-packages), Requirement.parse('urllib3<1.25,>=1.21'), {'sagemaker'}
- kubernetes - traefik 入口不转发 tcp 消息
- c++ - 简单c++代码导致的分段错误
- ruby-on-rails - 自定义文件夹不会在 Rails 6 中自动重新加载
- awk - 如何在 AWK 中将十进制值转换为十六进制值并存储在变量中?
- ios - UIPageViewController 让 UItalkeViewController 在 iOS 13 上“跳跃”