1. filter方法(推荐)
// 方法1: 使用索引判断
let arr = [0, 1, 2, 3, 4, 5, 6, 7];
let result = arr.filter((_, index) => index % 2 !== 0);
console.log(result); // [1, 3, 5, 7]
// 方法2: 位运算判断(性能更好)
let arr2 = [0, 1, 2, 3, 4, 5, 6, 7];
let result2 = arr2.filter((_, index) => index & 1);
console.log(result2); // [1, 3, 5, 7]
2. for循环(反向遍历)
// 反向遍历,避免索引变化问题
let arr = [0, 1, 2, 3, 4, 5, 6, 7];
for (let i = arr.length - 1; i >= 0; i--) {
if (i % 2 === 0) {
arr.splice(i, 1);
}
}
console.log(arr); // [1, 3, 5, 7]
3. while循环
let arr = [0, 1, 2, 3, 4, 5, 6, 7];
let i = 0;
while (i < arr.length) {
if (i % 2 === 0) {
arr.splice(i, 1);
} else {
i++;
}
}
console.log(arr); // [1, 3, 5, 7]
4. reduce方法
let arr = [0, 1, 2, 3, 4, 5, 6, 7];
let result = arr.reduce((acc, cur, index) => {
if (index % 2 !== 0) {
acc.push(cur);
}
return acc;
}, []);
console.log(result); // [1, 3, 5, 7]
5. forEach方法(需要新数组)
let arr = [0, 1, 2, 3, 4, 5, 6, 7];
let result = [];
arr.forEach((item, index) => {
if (index % 2 !== 0) {
result.push(item);
}
});
console.log(result); // [1, 3, 5, 7]
6. for...of循环(需要索引)
let arr = [0, 1, 2, 3, 4, 5, 6, 7];
let result = [];
for (let [index, value] of arr.entries()) {
if (index % 2 !== 0) {
result.push(value);
}
}
console.log(result); // [1, 3, 5, 7]
7. 性能对比
原地修改 vs 创建新数组
| 方法 |
是否修改原数组 |
时间复杂度 |
空间复杂度 |
适用场景 |
|---|
| filter |
否 |
O(n) |
O(n) |
需要保留原数组 |
| splice反向循环 |
是 |
O(n²) |
O(1) |
大数组慎用 |
| splice while循环 |
是 |
O(n²) |
O(1) |
小数组 |
| reduce |
否 |
O(n) |
O(n) |
函数式编程 |
性能优化建议:
// 优化方案:使用位运算提高性能
function removeEvenIndexes(arr) {
// 使用位运算判断奇数
return arr.filter((_, index) => index & 1);
// 或者直接创建新数组
// let result = [];
// for (let i = 1; i < arr.length; i += 2) {
// result.push(arr[i]);
// }
// return result;
}
8. 通用函数封装
/**
* 删除数组中偶数下标的元素
* @param {Array} array - 原始数组
* @param {boolean} inPlace - 是否原地修改
* @returns {Array} 处理后的数组
*/
function removeEvenIndexes(array, inPlace = false) {
if (inPlace) {
// 原地修改
for (let i = array.length - 1; i >= 0; i--) {
if (i % 2 === 0) {
array.splice(i, 1);
}
}
return array;
} else {
// 创建新数组
return array.filter((_, index) => index % 2 !== 0);
}
}
// 使用示例
const arr = [0, 1, 2, 3, 4, 5, 6, 7];
console.log(removeEvenIndexes(arr)); // [1, 3, 5, 7]
console.log(removeEvenIndexes(arr, true)); // 原地修改
总结
filter方法是最简洁、最易读的,推荐使用
如果需要
原地修改,使用反向循环+splice
对于
大数组,避免使用splice,因为时间复杂度为O(n²)
使用
位运算 index & 1 比取模运算性能更好
根据具体需求选择合适的方法:
- 需要保留原数组 → 使用filter
- 需要修改原数组 → 使用反向循环+splice
- 追求极致性能 → 手动for循环+位运算