數組API:map、filter、reduce實現

基礎

一、數組的 map、filter、reduce 是典型的高階函數,就是接收函數做爲參數的函數;
二、這三個函數都是在Array的原型上;數組

map

map() 方法建立一個新數組,其結果是該數組中的每一個元素是調用一次提供的函數後的返回值;
arr.map(function callback(currentValue[, index[, array]]),callback 提供了三個參數,當前元素、下標、源數組。ide

Array.prototype.myMap = function (fn) {  const that = this;  const result = [];  
  const length = that.length;  for (let i = 0; i < length; i++) {
    result.push(fn.call(that, that[i], i, that))
  }  return result
}複製代碼

filter

filter() 方法建立一個新數組, 其包含經過所提供函數實現的測試的全部元素;
arr.filter(callback(element[, index[, array]])[, thisArg]),callback 被調用時傳入三個參數:元素的值、元素的索引、被遍歷的數組自己。函數

Array.prototype.myFilter = function (fn) {  const that = this;  const result = [];  
  const length = that.length;  for (let i = 0; i < length; i++) {const boolean = fn.call(that, that[i], i, that)
    boolean && result.push(that[i])
  }  return result
}複製代碼

reduce

reduce() 方法對數組中的每一個元素執行一個reducer函數,將其結果彙總爲單個返回值;
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]);
callback函數被調用時傳入三四個參數:累計器、當前值、當前索引、源數組;
initialValue 是第一次調用 callback函數時的第一個參數的值。 若是沒有提供初始值,則將使用數組中的第一個元素。 在沒有初始值的空數組上調用 reduce 將報錯。測試

注意點:若是沒有提供 initialValue,reduce 會從索引1的地方開始執行 callback 方法,跳過第一個索引。若是提供 initialValue,從索引0開始。this

Array.prototype.myReduce = function (fn, initialValue) {  const that = this;  if (that.length === 0) return;  let result = initialValue || arr[0];  let startIndex = initialValue ? 0 : 1;  
  const length = that.length;  for (let i = startIndex; i < length; i++) {
    result = fn.call(that, result, that[i], i, that);
  }  return result;
}複製代碼
相關文章
相關標籤/搜索