单手撸之ES2019-Array.flatMap

1,318 阅读1分钟

老规矩,单手撸之前,先看看官方的语法:

const new_array = arr.flatMap((currentValue, index, array) => {
    // 返回新数组的元素
})

其中,

  • currentValue是数组处理的当前元素(必填)
  • index 正在处理元素的索引(可选)
  • array 正在被处理的数组(可选)

那我们看一看它的用法:

const array = [1, 2, 3];
const new_array = array.flatMap(ele => [ele * 2]) // [2, 4, 6]
const new_array2 = array.flatMap(ele => [[ele * 2]]) // [[2], [4], [6]]

乍一看,貌似跟Array.map有点像,仔细一看,它会将当前的元素展开一次并返回的,接下来我们分析一下它的特性:

  • 参数是一个函数,并且函数有三个参数分别为:currentValueindexarray;
  • 操作完当前元素后返回结果如果为数组将其展开
  • 原始数组未发生变化

在看一看flatMapmap的区别

let arr = ["今天天气不错", "", "早上好"]

arr.map(s => s.split(""))
// [["今", "天", "天", "气", "不", "错"],[],["早", "上", "好"]]

arr.flatMap(s => s.split(''));
// ["今", "天", "天", "气", "不", "错", "早", "上", "好"]

看到这里,我们就单手撸一波,还在Array.prototype上进行数组方法的扩展,下面是完整代码:

Array.prototype.myFlatMap = function (fn) {
    if (typeof fn !== 'function') return;
    const arr = this.slice();
    const ret = [];
    for (let i = 0; i < arr.length; i++) {
        ret.push(fn(arr[i], i, arr))
    }
    return ret.flat();
}

是不是很简单,这里用到了数组的flat方法,想了解flat的实现方法请看单手撸之ES2019-Array.flat