beka
5/1/2019 - 3:11 PM

reduce用法

reduce实现map

实现思路是,将每次遍历的元素,作为传入的函数的参数,并将函数执行的结果放入新的数组中。

Array.prototype._map = function(callback) {
  if (typeof callback !== 'function') {
    throw new Error('callback is not function')
  }
  return this.reduce((prev, item, index, arr) => {
    prev.push (callback(item, index, arr))
    return prev
  }, [])
}

reduce实现filter

实现filter的思路和实现map是一致的,只不过前者是一股脑的把执行结果全放入数组中,而filter需要做一个判断:如果filter函数传入的参数(参数是一个函数)执行后有返回值,即经过了检验,才将遍历的当前元素放入数组中,如果没有返回值,就忽略

Array.prototype._filter = function(callback) {
  if (typeof callback !== 'function') {
    throw new Error('callback is not function')
  }
  return this.reduce((prev, item, index, arr) => {
    callback(item, index, arr) ? prev.push(item) : null
    return prev
  }, [])
}

reduce实现获取最大值/最小值

var arr = [1, 2, 3, 4, 5]
var max = arr.reduce((prev, item) => Math.max(prev, item))
var min = arr.reduce((prev, item) => Math.mim(prev, item))

reduce实现数组去重

let arr = [1, 2, 3, 1, 1, 2, 3, 3, 4, 3, 4, 5]

let result = arr.reduce((prev, item, index, arr) => {
!prev.includes(item) && prev.push(item);
return prev
}, [])
console.log(result);  //[1, 2, 3, 4, 5]

reduce实现数组扁平化

let arr = [1, 2, '3js', [4, 5, [6], [7, 8, [9, 10, 11], null, 'abc'], {age: 58}, [13, 14]], '[]', null];
function f(arr) {
    if(Array.isArray(arr)) {
      return arr.reduce((prev, item) => {
        return Array.isArray(item) ? prev.concat(f(item)) : prev.concat(item)
      }, [])
    } else {
      throw new Error("arr + ' is not array'")
    }
}