Node.js手动实现数组排序:代码为何仅输出两个元素?
问题解析与代码修正
核心问题:splice方法的误用
你的代码里的arr.splice(arr.indexOf(min))写法错误——splice如果只传入一个参数,会从该索引位置开始删除数组中所有剩余元素,而不是只删除目标元素。这直接导致原数组长度快速缩短,循环提前终止。
逐次循环的运行逻辑
我们以输入数组[100, 83, 32, 9, 45, 61]为例,拆解每一步:
- 第一次循环(i=0)
- 找到数组最小值
9,对应索引3 - 执行
arr.splice(3):删除索引3及之后的所有元素,原数组变为[100, 83, 32] newArray推入9,此时newArray = [9]- i自增为1,当前
arr.length=3,满足i < arr.length,进入下一次循环
- 找到数组最小值
- 第二次循环(i=1)
- 找到数组最小值
32,对应索引2 - 执行
arr.splice(2):删除索引2及之后的元素,原数组变为[100, 83] newArray推入32,此时newArray = [9, 32]- i自增为2,当前
arr.length=2,2 < 2不成立,循环直接终止
- 找到数组最小值
这就是为什么最终只得到两个元素的结果。
修正后的代码
只需要给splice添加第二个参数1,指定仅删除目标索引的单个元素;同时建议复制原数组操作,避免修改传入的原始数组:
function sortArray(arr) { let newArray = []; let tempArr = [...arr]; for (let i = 0; i < tempArr.length; i++) { let min = Math.min(...tempArr); let minIndex = tempArr.indexOf(min); newArray.push(min); tempArr.splice(minIndex, 1); // 仅删除找到的最小元素 } return newArray; } console.log(sortArray([100, 83, 32, 9, 45, 61])); // 输出 [9, 32, 45, 61, 83, 100]
内容的提问来源于stack exchange,提问作者Shraddha Vkarma
相关产品推荐
相关产品推荐

