经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JavaScript中数组flat方法的使用与实现方法
来源:jb51  时间:2022/8/22 16:18:01  对本文有异议

前言

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

语法

var newArray = arr.flat([depth])

参数

depth 可选

指定要提取嵌套数组的深度,默认值为 1。

返回值

一个包含将数组与子数组中所有元素的新数组。(就是扁平化后的每一项重新组成的数组,所以不会改变原数组。)

使用示例

扁平化数组,不传递参数的时候默认为一层

  1. let arr = [1,2,[3,[4,[5]]]]
  2. const reasut = arr.flat()
  3. console.log(reasut)
  4. // [1, 2, 3, [4,[5]]]

设置扁平化的深度

  1. let arr = [1,2,[3,[4,[5]]]]
  2. const reasut2 = arr.flat(3)
  3. console.log(reasut2)
  4. // [1, 2, 3, 4, 5]

当传入Infinity时,相当于扁平化最深层次的数组

  1. let arr = [1,2,[3,[4,[5]]]]
  2. const reasut3 = arr.flat(Infinity)
  3. console.log(reasut3)
  4. // [1, 2, 3, 4, 5]

当数组里面有空项的时候,会过滤掉空值

  1. const arr2 = [1, , 2, [3]]
  2. const reasut4 = arr2.flat()
  3. console.log(reasut4)
  4. // [1, 2, 3]

方法实现

1、当只扁平化一层的时候

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2. function getFlatArr (list) {
  3. return list.reduce((pre, item) => {
  4. return pre.concat(item)
  5. }, [])
  6. }
  7. console.log(getFlatArr(arr5))
  8. // [1,2,3,[4,5],6,[7],8]

上述代码使用reduce方法和concat方法组合,实现只展平一层数组的方法。还可以使用foreach和push方法如:

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2.  
  3. function getFlatArr (list) {
  4. let result = []
  5. list.forEach(element => {
  6. if (Array.isArray(element)) {
  7. result.push(...element)
  8. } else {
  9. result.push(element)
  10. }
  11. })
  12. return result
  13. }
  14. console.log(getFlatArr(arr5))
  15. // [1,2,3,[4,5],6,[7],8]

上述代码采用foreach方法对数组的每一项循环,并使用isArray方法判断是不是数组将当前项push进result中,最后返回result。

2、当数组展平的层数为最大层时

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2. function getFlatArr (list) {
  3. return list.reduce((pre, item) => pre.concat(Array.isArray(item)? getFlatArr(item): item), [])
  4. }
  5. console.log(getFlatArr(arr5))
  6. // [1, 2, 3, 4, 5, 6, 7, 8]

上述代码使用数组的reduce方法和递归的形式实现,当reduce方法循环到数组的每一项时都去判断当前项是不是新的数组,是的话就使用递归去吧里面的每一项逐层剥离出来,最后进行合并,不是数组的话,就直接将当前项合并到数组中。还可以使用foreach方法+递归的方式进行实现,如:

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2. function getFlatArr (list) {
  3. const result = []
  4. ;(function flat(list) {
  5. // forEach 自动去除数组空位
  6. list.forEach(item => {
  7. // 判断是不是数组
  8. if (Array.isArray(item)) {
  9. // 进行数组递归
  10. flat(item)
  11. } else {
  12. result.push(item)
  13. }
  14. })
  15. })(list)
  16. return result
  17. }
  18. console.log(getFlatArr(arr5))
  19. // [1, 2, 3, 4, 5, 6, 7, 8]

上述代码创建一个新的数组,使用foreach方法循环原始数组的每一项,然后判断当前项是否是一个数组是的话就递归,不是的话就将当前项push进新创建的数组,最后返回创建的数组。还可以使用堆栈的概念来实现,如:

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2. function getFlatArr (list) {
  3. const arrList = JSON.parse(JSON.stringify(list))
  4. const result = []
  5. while (arrList.length) {
  6. // 弹出堆栈中的数据
  7. let arr = arrList.shift()
  8. if (Array.isArray(arr)) arrList.unshift(...arr)
  9. else result.push(arr)
  10. }
  11. return result
  12. }
  13.  
  14. console.log(getFlatArr(arr5))
  15. // [1, 2, 3, 4, 5, 6, 7, 8]

上述代码使用堆栈概念存储数据,使用while语句进行循环弹出堆栈中的数据,弹出的数据如果不是数组类型的话就push进创建的新数组中,否则的话就将当前项解构后在一次存储进堆栈中,重复上述操作直到堆栈中的数据被清空,最后返回创建的数组。

3、数组扁平化使用参数控制扁平的深度

可以使用reduce方法和递归来实现如:

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2. function getFlatArr (list, deepNum = 1) {
  3. return deepNum > 0? list.reduce((pre, item) => {
  4. return pre.concat(Array.isArray(item)? getFlatArr(item, deepNum - 1): item)
  5. }, []): list.slice()
  6. }
  7.  
  8. console.log(getFlatArr(arr5))
  9. // [1,2,3,[4,5], 6,[7], 8]
  10.  
  11. console.log(getFlatArr(arr5, 3))
  12. // [1, 2, 3, 4, 5, 6, 7, 8]

上述代码使用reduce方法,将循环的当前项展开成一个数组,然后通过传入的deepNum参数来控制展开的深度,当deepNum小于1的时候就返回原数组的一个浅拷贝,否则就根据deepNum的大小来展开对应深度的数组。还可以使用foreach方法+递归的形式来实现,如:

  1. const arr5 = [1,2,[3,[4,5]], [6,[7]], 8]
  2. function getFlatArr (list, deepNum = 1) {
  3. const result = []
  4. ;(function flat(list, deepNum) {
  5. list.forEach(element => {
  6. // 判断当前元素是否为数组并控制递归的深度
  7. if (Array.isArray(element) && deepNum > 0) flat(element, deepNum - 1)
  8. else result.push(element)
  9. })
  10. })(list, deepNum)
  11. return result
  12. }
  13.  
  14. console.log(getFlatArr(arr5))
  15. // [1,2,3,[4,5], 6,[7], 8]
  16.  
  17. console.log(getFlatArr(arr5, 3))
  18. // [1, 2, 3, 4, 5, 6, 7, 8]

上述代码,首先创建一个新的数组result,然后使用自调用函数,传入原数组和深度大小,使用foreach进行循环,然后判断循环的当前项是否为数组,并且递归的深度的大小大于0,是的话就继续递归当前数组,深度减去1。否则的话就将当前元素push进新创建的数组result中,就是通过这样循环的方法,最后将原来数组中的每一项根据传入的深度大小都push进了一开始创建的新数组result中,最后返回数组result即可。

总结

到此这篇关于JavaScript中数组flat方法的使用与实现的文章就介绍到这了,更多相关js数组flat方法内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号