# Array.prototype.map 的实现

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

function map(arr, mapCallback) {
  // 首先,检查传递的参数是否正确。
  if (!Array.isArray(arr) || !arr.length || typeof mapCallback !== 'function') {
    return []
  } else {
    let result = []
    // 每次调用此函数时,我们都会创建一个result数组
    // 因为不想改变原始数组
    for (let i = 0, len = arr.length;i < len; i++) {
      // 将mapCallback返回的结果push搭配result数组中
      result.push(mapCallback(arr[i], i, arr))
    }

    return result
  }
}

# Array.prototype.filter 的实现

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素

function filter(arr, filterCallback) {
  // 检查传递的参数是否正确

  if (!Array.isArray(arr) || !arr.length || typeof filterCallback !== 'function') {
    return []
  } else {
    let result = []
    // 每次调用此函数时,我们都会创建一个 result 数组
     // 因为我们不想改变原始数组。
     for (let i = 0, len = arr.length; i < len; i++) {
       // 检查filterCallback的返回值是否是真值
       if (filterCallback(arr[i], i, arr)) {
         // 如果条件为真,则将数组元素 push 到 result 中
         result.push(arr[i])
       }
     }
     // return the result array
     return result
  }
}

# Array.prototype.reduce的实现

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

function reduce(arr, reduceCallback, initialValue) {
  // 首先,检查传递的参数是否正确。
  if (!Array.isArray(arr) || !arr.length || typeof reduceCallback !== 'function') 
  {
    return [];
  } else {
    // 如果没有将initialValue传递给该函数,我们将使用第一个数组项作为initialValue
    let hasInitialValue = initialValue !== undefined
    let value = hasInitialValue ? initialValue : arr[0] // 兼容不传第三个参数

    // 如果有传递 initialValue,则索引从 1 开始,否则从 0 开始
    for (let i = hasInitialValue ? 1 : 0, len = arr.length; i < len; i++) {
      value = reduceCallback(value, arr[i], i, arr)
    }

    return value
  }
}