Array的flat()和flatMap()

flat()

简述

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

语法

var newArray = arr.flat([depth]); 
  • 参数
    depth:可选。指定要提取嵌套数组的结构深度,默认值为 1。
  • 返回值
    一个包含将数组与子数组中所有元素的新数组。

flat()将二维及多维数组转换成一维

  • 嵌套数组

    var arr1 = [1, 2, [3, 4]];
    arr1.flat();    //要提取的结构深度为1
    // [1, 2, 3, 4]
    
    var arr2 = [1, 2, [3, 4, [5, 6]]];
    arr2.flat();    //要提取的结构深度为1
    // [1, 2, 3, 4, [5, 6]]
    
    var arr3 = [1, 2, [3, 4, [5, 6]]];
    arr3.flat(2);   //要提取的结构深度为2
    // [1, 2, 3, 4, 5, 6]
    
    //使用 Infinity,可展开任意深度的嵌套数组
    var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
    arr4.flat(Infinity);
    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
    
  • 数组空项
    flat() 方法会移除数组中的空项

    var arr4 = [1, 2, , 4, 5];
    arr4.flat();
    // [1, 2, 4, 5]
    

flatMap()

简述

flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。
它与 map 连着深度值为1的 flat 几乎相同,但 flatMap 通常在合并成一种方法的效率稍微高一些。

语法

var new_array = arr.flatMap((currentValue[, index[, array]]) => {
// 返回新数组的元素
}[, thisArg])
  • 参数
    callbackFn回调函数:可以生成一个新数组中的元素的函数,可以传入三个参数:
    currentValue:当前正在数组中处理的元素
    index可选:可选的。数组中正在处理的当前元素的索引。
    array可选:可选的。被调用的 map 数组
    thisArg可选:可选的。执行 callback 函数时 使用的this 值。

  • 返回值
    一个新的数组,其中每个元素都是回调函数的结果,并且结构深度 depth 值为1。

扁平化应用

// 数据
let data = [
    {id:1,name:'a',children:[
        {id:11,name:"a1"},
        {id:12,name:'a2'}
    ]},
    {id:2,name:'b'},
    {id:3,name:'c',children:[
        {id:31,name:'c1'},
        {id:32,name:'c2'}    
    ]}
]

// 期望转化为
//[
//    {id:1,name:'a'},
//    {id:11,name:'a1'},
//    {id:12,name:'a2'},
//    {id:2,name:'b'},
//    {id:3,name:'c'},
//    {id:31,name:'c1'},
//    {id:32,name:'c2'}  
//]

// 方法
let f = (a) => a.flatMap(({children: c = [], ...r}) => [r, ...f(c)]);
f(data); // 可以展平任意级别

附:

MDN中的flat
MDN中的flatMap

posted @ 2020-09-22 18:29  ZerlinM  阅读(506)  评论(0编辑  收藏  举报