js手写常见数组方法

49 阅读1分钟

//****************************************forEach

Array.prototype.myForEach = function (callback) {
    for (let i = 0; i < this.length; i++) {
        callback(this[i], i, this);
    }
};



// 示例用法
const arr = [1, 2, 3, 4, 5];
arr.myForEach((value, index, array) => {
    console.log(`Value: ${value}, Index: ${index}, Array: ${array}`);
});

//****************************************map
Array.prototype.myMap = function (callback) {
    const newArray = [];
    for (let i = 0; i < this.length; i++) {
        newArray.push(callback(this[i], i, this));
    }
    return newArray;
};

// 示例用法
const arr = [1, 2, 3, 4, 5];
const squaredArr = arr.myMap((value, index, array) => {
    return value * value;
});
console.log(squaredArr);


//****************************************filter
Array.prototype.myFilter = function (callback) {
    const newArray = [];
    for (let i = 0; i < this.length; i++) {
        if (callback(this[i], i, this)) {
            newArray.push(this[i]);
        }
    }
    return newArray;
};

// 示例用法
const arr = [1, 2, 3, 4, 5];
const evenArr = arr.myFilter((value, index, array) => {
    return value % 2 === 0;
});
console.log(evenArr);


//****************************************some
Array.prototype.mySome = function (callback) {
    for (let i = 0; i < this.length; i++) {
        if (callback(this[i], i, this)) {
            return true;
        }
    }
    return false;
};

// 示例用法
const arr = [1, 2, 3, 4, 5];
const hasEven = arr.mySome((value, index, array) => {
    return value % 2 === 0;
});
console.log(hasEven);


//****************************************every
Array.prototype.myEvery = function (callback) {
    for (let i = 0; i < this.length; i++) {
        if (!callback(this[i], i, this)) {
            return false;
        }
    }
    return true;
};

// 示例用法
const arr = [1, 2, 3, 4, 5];
const allEven = arr.myEvery((value, index, array) => {
    return value % 2 === 0;
});
console.log(allEven);


//****************************************reduce
Array.prototype.myReduce = function (callback, initialValue) {
    let accumulator = initialValue === undefined ? this[0] : initialValue;
    for (let i = 0; i < this.length; i++) {
        accumulator = callback(accumulator, this[i], i, this);
    }
    return accumulator;
};

// 示例用法
const arr = [1, 2, 3, 4, 5];
const sum = arr.myReduce((accumulator, value, index, array) => {
    return accumulator + value;
}, 0);
console.log(sum);

//reduce(cb,初始值)=>返回最后累计值


//reduce妙用:查括号是否匹配
const str = "(()()())";
const balanced = str.split("").reduce((acc, cur) => {
    if (cur === "(") {
        acc++;
    } else if (cur === ")") {
        acc--;
    }
    return acc;
}, 0) === 0;
console.log(balanced); // true


//****************************************slice

Array.prototype.mySlice = function (startIndex, endIndex) {
    const newArray = [];
    const length = this.length;

    // 处理 startIndex 和 endIndex 的默认值
    const start = startIndex === undefined ? 0 : (startIndex >= 0 ? startIndex : length + startIndex);
    const end = endIndex === undefined ? length : (endIndex >= 0 ? endIndex : length + endIndex);

    // 确保 start 和 end 在有效范围内
    const finalStart = Math.max(0, Math.min(length, start));
    const finalEnd = Math.max(0, Math.min(length, end));

    // 将数组的元素复制到新数组中
    for (let i = finalStart; i < finalEnd; i++) {
        newArray.push(this[i]);
    }

    return newArray;
};

// 示例用法
const arr = [1, 2, 3, 4, 5];
const slicedArr = arr.mySlice(1, 4);
console.log(slicedArr);




//****************************************splice
const arr = [1, 2, 3, 4, 5];

// 删除元素示例
const deletedItems = arr.splice(2, 2);
console.log(arr); // [1, 2, 5]
console.log(deletedItems); // [3, 4]

// 插入元素示例
arr.splice(2, 0, 6, 7);
console.log(arr); // [1, 2, 6, 7, 5]

// 替换元素示例
arr.splice(2, 1, 8, 9);
console.log(arr); // [1, 2, 8, 9, 7, 5]