[JavaScript编码能力]手写数组遍历方法

156 阅读1分钟

forEach()

Array.prototype.myForEach = function (cb) {
    var _arr = this
    var _len = _arr.length
    var _arg2 = arguments[1] || window // forEach第二个参数 || window

    for (var i = 0; i < _len; i++) {
        cb.apply(_arg2, [_arr[i], i, _arr])
    }
}

map()

Array.prototype.myMaP = function (cb) {
    var _arr = this // this 就是调用 reduce 方法的数组
    var _len = _arr.length //数组的长度
    var _arg2 = arguments[1] || window // map第二个参数 || window
    var _newArr = []

    for (var i = 0; i < _len; i++) {
        //绑定this,并将数组作为参数传给回调函数,将结果推入空数组
        _newArr.push(cb.apply(_arg2, [_arr[i], i, _arr]))
    }
    return _newArr
}

filter()

Array.prototype.myFilter = function (cb) {
    var _arr = this // this 就是调用 reduce 方法的数组
    var _len = _arr.length //数组的长度
    var _arg2 = arguments[1] || window // filter第二个参数 || window
    var _newArr = []

    for (var i = 0; i < _len; i++) {
        cb.apply(_arg2, [_arr[i], i, _arr]) ? _newArr.push(_arr[i]) : ''
    }
    return _newArr
}

every()

Array.prototype.myEvery = function (cb) {
    var _arr = this // this 就是调用 reduce 方法的数组
    var _len = _arr.length //数组的长度
    var _arg2 = arguments[1] || window // every第二个参数 || window
    var _res = true // 默认设置为true

    for (var i = 0; i < _len; i++) {
        // 如果有一项不符合,修改为false,退出循环
        if (!cb.apply(_arg2, [_arr[i], i, _arr])) {
            _res = false
            break
        }
    }
    return _res
}

some()

Array.prototype.mySome = function (cb) {
    var _arr = this
    var _len = _arr.length
    var _arg2 = arguments[1] || window // some第二个参数 || window
    var _res = false // 默认设置为 false

    for (var i = 0; i < _len; i++) {
        // 如果有一项符合,修改为true,退出循环
        if (cb.apply(_arg2, [_arr[i], i, _arr])) {
            _res = true
            break
        }
    }
    return _res
}

reduce()

Array.prototype.myReduce = function (cb, initialValue) {
    var _arr = this // this 就是调用 reduce 方法的数组
    var _len = _arr.length //数组的长度
    var res = initialValue || _arr[0]   // 有初始值使用初始值
    var startIndex = initialValue ? 0 : 1 // 有初始值的话从0遍历, 否则从1遍历
    for (var i = startIndex; i < _len; i++) {
        res = cb(res, _arr[i], i, _arr) // 每次回调的返回值,都会传入下次回调
    }
    return res
}

reduceRight()

Array.prototype.myReduceRight = function (cb, initialValue) {
    var _arr = this // this 就是调用 reduce 方法的数组
    var _len = _arr.length //数组的长度
    var res = initialValue || _arr[0]   // 有初始值使用初始值
    var startIndex = initialValue ? _len : _len - 1 // 有初始值的话从0遍历, 否则从1遍历
    for (var i = startIndex; i >= 0; i--) {
        res = cb.call(res, _arr[i], i, _arr) // 每次回调的返回值,都会传入下次回调
        console.log(res)
    }
    return res
}