JS数组遍历方法(forEach、map、filter、some、every)的自定义实现

74 阅读1分钟

话不多说,直接上代码; 有大佬看到的话,有其他更好的实现方式希望能给予指导; 性能,代码优化暂时没考虑; 前端菜鸟,勿喷,谢谢!

const numbers = ['a', 'b', 'c', 'd', 'e', 'f', NaN]

1.Array.forEach()

Array.prototype.definedForEach = function (callback) {
  if (Array.isArray(this)) {
    for(let i = 0; i < this.length; i++) {
      callback.call(undefined, this[i], i, this)
    }
  } else {
    throw new Error('argumnets type error, muse be a Array object')
  }
}

numbers.definedForEach((currentvalue, index, array) => {
  // console.log(currentvalue, index, array)
})

2. Array.map()

Array.prototype.definedMap = function (callback) {
  if (Array.isArray(this)) {
    const result = []
    for(let i = 0; i < this.length; i++) {
      result[i] = callback.call(undefined, this[i], i, this)
    }
    return result
  } else {
    throw new Error('argumnets type error, muse be a Array object')
  }
}

const numbersMap = numbers.definedMap((currentvalue, index) => `${currentvalue}${index}`)

// console.log(numbersMap)

3. Array.filter()

Array.prototype.definedFilter = function (callback) {
  if (Array.isArray(this)) {
    const result = []
    for(let i = 0; i < this.length; i++) {
      callback.call(undefined, this[i], i, this) ? result.push(this[i]) : undefined 
    }
    return result
  } else {
    throw new Error('argumnets type error, muse be a Array object')
  }
}

const numbersFilter = numbers.definedFilter(currentvalue => currentvalue === 'a' || currentvalue === 'b')

// console.log(numbersFilter)

4. Array.some()// 数组遍历方法,有一个满足就返回true,否则返回false

Array.prototype.definedSome = function (callback) {
  if (Array.isArray(this)) {
    let result = []
    for (let i = 0; i < this.length; i++) {
      result[i] = callback.call(undefined, this[i], i, this) 
    }
    return result.includes(true)
  } else {
    throw new Error('argumnets type error, muse be a Array object')
  }
}

const numbersSome = numbers.definedSome(currentvalue => currentvalue === 'a')

// console.log(numbersSome)

5.Array.every() // 数组遍历方法,有一个满足就返回true,否则返回false

Array.prototype.definedEvery = function (callback) {
  if (Array.isArray(this)) {
    const result = []
    for (let i = 0; i < this.length; i++) {
      result[i] = callback.call(undefined, this[i], i, this)
    }
    // 既有true又有false, 返回false
    if (result.includes(true) && result.includes(false)) {
      return false
    // 只有true 返回true
    } else if (result.includes(true) && !result.includes(false)) {
      return true 
       // 只有false 返回false
    } else if(result.includes(false) && !result.includes(true)) {
      return false
    } else {
      return
    }
  } else {
    throw new Error('argumnets type error, muse be a Array object')
  }
}

const arr = [11, 12, 13]

const numbersEvery = arr.definedEvery(currentvalue => currentvalue > 10)

console.log(numbersEvery)