不使用sort()方法排序JavaScript数组时的循环及元素删除问题
问题分析与解决方案
代码异常原因
- 错误使用
for...in遍历数组:for...in是为遍历对象属性设计的,用来遍历数组时会拿到字符串类型的索引,且当原数组通过splice缩短长度后,for...in的遍历次数不会动态调整,导致循环无法正常结束。 - 未收集排序结果:代码中仅执行了
splice删除原数组元素,但没有将删除的元素添加到newArr中,最终返回的是空数组。
修复后的排序代码
// 找出数组中最小元素的索引 const least_num = (arr) => { let smallest = arr[0]; let smallest_index = 0; for(let i = 1; i < arr.length; i++){ if (arr[i] < smallest) { smallest = arr[i]; smallest_index = i; } } return smallest_index; } const sortArray = (arr) => { // 复制原数组,避免修改传入的原始数组 const tempArr = [...arr]; const newArr = []; // 使用while循环,直到临时数组为空 while(tempArr.length > 0){ const smallestIndex = least_num(tempArr); // 将删除的最小元素推入新数组 newArr.push(tempArr.splice(smallestIndex, 1)[0]); } return newArr; } console.log(sortArray([5,4,3,2,1])); // 输出:[1,2,3,4,5]
JavaScript中通过索引删除数组元素的方法
1. splice方法(推荐,直接修改原数组)
语法:array.splice(index, deleteCount)
index:要删除元素的起始索引deleteCount:要删除的元素数量
示例:
const arr = [1,2,3,4]; const deletedItems = arr.splice(1, 2); // 删除索引1开始的2个元素 console.log(arr); // 输出:[1,4] console.log(deletedItems); // 输出:[2,3]
2. slice方法(不修改原数组,返回新数组)
通过截取索引前后的部分数组再拼接,实现删除效果:
const arr = [1,2,3,4]; const newArr = arr.slice(0, 1).concat(arr.slice(3)); // 删除索引1、2的元素 console.log(arr); // 原数组不变:[1,2,3,4] console.log(newArr); // 输出:[1,4]
3. delete操作符(不推荐)
使用delete会将对应索引位置的值设为undefined,但数组长度不变,会留下空位:
const arr = [1,2,3,4]; delete arr[1]; console.log(arr); // 输出:[1, undefined, 3, 4]
内容的提问来源于stack exchange,提问作者ram Kumar
相关产品推荐
相关产品推荐

