在前端开发中,我们经常需要对多层嵌套的数组进行操作,这时候就需要使用到 flatten
方法,将多维数组转化为一维。在 ES6 中,我们可以通过递归的方式实现 flatten
方法,但是代码较为复杂,难以维护。在 ES9 中,新增了一个 Array.prototype.flat
方法,可以方便地实现多维数组的转化,提高代码的可读性和可维护性。
Array.prototype.flat
方法详解
Array.prototype.flat
方法用于将多维数组转化为一维数组,并返回一个新的数组。该方法可以接收一个参数,表示要展开的层数。如果不传入参数,则默认只展开一层。
下面是一个基本的示例代码:
const arr1 = [1, 2, [3, 4]]; console.log(arr1.flat()); //[1,2,3,4] const arr2 = [1, 2, [3, [4, 5]]]; console.log(arr2.flat()); //[1,2,3,[4,5]] console.log(arr2.flat(2)); //[1,2,3,4,5]
在上面的代码中,arr1
和 arr2
分别是两个多维数组。调用 flat
方法时,arr1.flat()
默认只展开一层,将 [3,4]
作为一个整体,将其转化为 [1,2,3,4]
。而 arr2.flat()
中包含两层嵌套,需要使用参数 2
进行指定展开的层数,最终得到 [1,2,3,4,5]
。
原生 flatten
方法的示例
在 ES6 中,我们可以通过递归的方式实现 flatten
方法。下面是一个基本的示例代码:
// ES6 function flatten(arr) { return arr.reduce((prev, cur) => { return prev.concat(Array.isArray(cur) ? flatten(cur) : cur); }, []); } const arr = [1, [2, [3, 4], 5], 6]; console.log(flatten(arr)); //[1,2,3,4,5,6]
在上面的代码中,flatten
方法使用了递归的方式对多维数组进行了展开。这样的方式虽然可以实现功能,但是代码复杂度高,难以维护,降低了代码的可读性和可维护性。
使用 ES9 新增 Array.prototype.flat
优化代码
在 ES9 中,我们可以通过 Array.prototype.flat
方法方便地实现多维数组的转化,代码量大大减少,可读性和可维护性得到提升。下面是一个通过 Array.prototype.flat
方法实现的示例代码:
// ES9 const arr = [1, [2, [3, 4], 5], 6]; console.log(arr.flat(Infinity)); //[1,2,3,4,5,6]
在上面的代码中,arr.flat(Infinity)
中传入 Infinity
参数,表示展开所有的嵌套层级,这样可以方便地实现多维数组的转化。相较于在 ES6 中实现 flatten
方法,代码量大幅度减少,可读性和可维护性得到提升。
使用 flatMap
方法进一步优化
在 ES10 中,新增了一个 flatMap
方法,这个方法可以在执行 map
方法之后直接调用 flat
方法,可以进一步优化代码。下面是一个通过 flatMap
方法实现的示例代码:
// ES10 const arr = [1, 2, 3, 4]; console.log(arr.flatMap(x => [x * 2])); //[2,4,6,8] const arr2 = [1, 2, 3, 4]; console.log(arr2.flatMap(x => [[x * 2]])); //[[2],[4],[6],[8]]
在上面的代码中,flatMap
方法接收一个函数作为参数,该函数返回一个数组,将这些数组展开成一维数组。通过使用 flatMap
方法,可以直接同时完成 map
和 flat
两个操作,代码更加简洁、可读性更高。
总结
在 ES9 中,新增了一个 Array.prototype.flat
方法,可以方便地实现多维数组的转化,提高了代码的可读性和可维护性。在 ES10 中,新增了一个 flatMap
方法,可以进一步优化代码。在实际开发中,我们应该尽可能地使用新的 API,提高代码效率和可维护性,减少错误和编写时间。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6594b9a4eb4cecbf2d9022b4