ECMAScript 2017 中的 Array.prototype.flat() 和 Array.prototype.flatMap():更好的数组处理
JavaScript 数组是一种基本数据结构,相信前端工程师都在自己的项目中有过相当多的应用。在 ECMAScript 2017 中,我们发现了两个有趣的新方法:Array.prototype.flat() 和 Array.prototype.flatMap()。
这两个方法可以将一个嵌套数组 “拍平” 或者根据原数组按需返回一个新数组,使数组处理变得更加高效、快捷和清晰。下面,让我们分别来深入学习和掌握这两个数组方法的使用。
一、Array.prototype.flat()
方法定义:
array.flat([depth])
参数说明:
depth
:可选参数,即展开的深度,默认值为 1。如果需要完全展开,则可以使用Infinity
。
方法作用:
- 将一个嵌套数组 “拍平”,返回一个新数组。
举个例子,现在我们有一个嵌套数组:
let arr = [1, 2, [3, 4], [5, [6, 7]]];
如果需要将 arr 数组拍平,即将所有嵌套数组里的元素提取到一个新的数组中,可以使用 flat() 方法:
let flatArr = arr.flat(); console.log(flatArr); // [1, 2, 3, 4, 5, [6, 7]]
flat() 方法可以将嵌套数组“拍平”,逐层提取内部嵌套数组的元素,并形成一个新的一维数组。当然,这个过程是根据 depth 深度进行的。
如果我们希望展开所有嵌套,可以把 depth 设置为 Infinity:
let arr = [1, 2, [3, 4], [5, [6, 7]]]; let flatArr = arr.flat(Infinity); console.log(flatArr); // [1, 2, 3, 4, 5, 6, 7]
正如这个例子所示,Infinity 可以将所有嵌套拆分到一维数组中。使用 flat() 方法可以大大提升数组的操作效率。
二、Array.prototype.flatMap()
方法定义:
array.flatMap(callbackFunction)
参数说明:
callbackFunction(element, index, array)
:使用方式与 map() 方法相似,其中处理函数必须返回一个数组,也就是说,该函数的返回值可以是一个一维数组,也可以是一个嵌套数组。flatMap() 会将这些返回值自动‘拍平’成一个数组(默认展开深度为1)。
方法作用:
- 根据原数组按需返回一个新数组,较为高效
举个例子,现在我们有一个数组:
let arr = [1, 2, 3, 4, 5];
如果将数组中每个元素都乘 2 并返回新数组,可以使用 map() 方法,它会返回一个新的数组,添加了所有项修改后的新值:
let newArr = arr.map(x => x * 2); console.log(newArr); // [2, 4, 6, 8, 10]
现在,如果我们希望将它们嵌套在不同的数组中,并返回一个一维数组,可以使用 flat() 方法:
let newFlatArr = arr.map(x => [x * 2]).flat(); console.log(newFlatArr); // [2, 4, 6, 8, 10]
在这个例子中,我们使用 map() 方法和一个含有单个元素(即每个元素都被乘以 2)的数组,然后使用 flat() 方法,它会将整个数组 ‘拍平’,生成一个一维数组。但是这里,确实是需要两次方法调用才能实现的。
而使用 flatMap() 方法,可以减少方法调用次数:
let newFlatMapArr = arr.flatMap(x => [x * 2]); console.log(newFlatMapArr); // [2, 4, 6, 8, 10]
利用 flatMap() 方法,只需一次调用,就能达到 map() 和 flat() 同时实现的结果。可以看出,当处理函数已经返回一个嵌套数组时,使用 flatMap() 方法会更简单、更清晰,并且更加高效。
总结
ECMAScript 2017 引入的 Array.prototype.flat() 和 Array.prototype.flatMap(),可以将嵌套数组‘拍平’,或者根据原数组按需返回一个新数组,从而降低了数组处理的复杂度,同时提高了效率和清晰度。在实际开发中,熟练掌握这两个方法的使用,有助于提高代码的质量和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f5b805f6b2d6eab3e8bc40