南安市分类吧

JavaScript数组中删除偶数下标值的方法大全

2026-03-27 18:43:01 浏览次数:0
详细信息

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 比取模运算性能更好

根据具体需求选择合适的方法:

相关推荐