• JS手写数组扁平化(flat)方法


    方法介绍

    数组扁平化方法 Array.prototype.flat() 也叫数组拍平、数组拉平、数组降维

    Array.prototype.flat() 用于将嵌套的数组“拉平”,变成一维的数组。

    该方法返回一个新数组,对原数据没有影响。

    • 不传参数时,默认“拉平”一层,可以传入一个整数,表示想要“拉平”的层数。
    • 传入 <=0 的整数将返回原数组,不“拉平”。
    • Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组。
    • 如果原数组有空位,Array.prototype.flat() 会跳过空位。

    代码示例:

    1. const arr = [1,[2,3],[4,[5,[6]],7]];
    2. // 不传参数时,默认“拉平”一层
    3. arr.flat()
    4. // [1,2,3,4,[5,[6]],7];
    5. // 传入一个整数参数,整数即“拉平”的层数
    6. arr.flat(2)
    7. // [1,2,3,4,5,[6],7];
    8. // Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
    9. arr.flat(Infinity);
    10. // [1,2,3,4,5,6,7];
    11. // 传入 <=0 的整数将返回原数组,不“拉平”
    12. arr.flat(0);
    13. // [1,[2,3],[4,[5,[6]],7]]
    14. arr.flat(-6);
    15. // [1,[2,3],[4,[5,[6]],7]]
    16. // 如果原数组有空位,flat()方法会跳过空位
    17. [1,2,3,4,5,6,,].flat();
    18. // [1,2,3,4,5,6]

     开始手写

    思路:实现一个有数组扁平化功能的 flat 函数,要做的就是在数组中找到是数组类型的元素,然后将他们展开。这就是实现数组拍平 flat 方法的关键思路。

    遍历数组方案:

    for 循环;for...of;for...in;forEach();entries();keys();values();reduce();map()

    判断元素是数组方案:

    instanceof;constructor;Object.prototype.toString;isArray

    将数组的元素展开一层方案:

    扩展运算符(…) ; concat;

    apply:主要是利用 apply 在绑定作用域时,传入的第二个参数是一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。也就是在调用 apply 函数的过程中,会将传入的数组一个一个的传入到要执行的函数中,也就是相当对数组进行了一层的展开。

    使用forEach+push递归实现:

    1. const arr = [1,[2,3],[4,[5,[6]],7]];
    2. function func(array) {
    3. let newArr = []
    4. const rec = (arr) => {
    5. arr.forEach(item => {
    6. if (!Array.isArray(item)) {
    7. newArr.push(item)
    8. } else {
    9. rec(item)
    10. }
    11. })
    12. }
    13. rec(array)
    14. return newArr
    15. }
    16. let res = func(arr)
    17. console.log(res) //[1,2,3,4,5,6,7]

     使用for循环+concat实现:

    1. const arr = [1,[2,3],[4,[5,[6]],7]];
    2. function flatten(arr) {
    3. let result = [];
    4. for (let i = 0; i < arr.length; i++) {
    5. if (Array.isArray(arr[i])) {
    6. result = result.concat(flatten(arr[i]));
    7. } else {
    8. result = result.concat(arr[i])
    9. }
    10. }
    11. return result
    12. }
    13. console.log(flatten(arr));//[1,2,3,4,5,6,7]

    增加参数控制扁平化深度,可以理解为手写flat()方法:

    1. const arr = [1,[2,3],[4,[5,[6]],7]];
    2. //版本1:
    3. // forEach 遍历数组会自动跳过空元素
    4. const eachFlat = (arr = [], depth = 1) => {
    5. const result = [];
    6. (function flat(arr, depth) {
    7. arr.forEach((item) => {
    8. if (Array.isArray(item) && depth > 0) {
    9. flat(item, depth - 1)
    10. } else {
    11. result.push(item)
    12. }
    13. })
    14. })(arr, depth)
    15. return result;
    16. }
    17. console.log(eachFlat(arr,2))//[1,2,3,4,5,[6],7]
    18. //版本2:
    19. // for of 循环不能去除数组空位,需要手动去除
    20. const forFlat = (arr = [], depth = 1) => {
    21. const result = [];
    22. (function flat(arr, depth) {
    23. for (let item of arr) {
    24. if (Array.isArray(item) && depth > 0) {
    25. flat(item, depth - 1)
    26. } else {
    27. // 去除空元素,添加非 undefined 元素
    28. item !== void 0 && result.push(item);
    29. }
    30. }
    31. })(arr, depth)
    32. return result;
    33. }
    34. console.log(forFlat(arr,2))//[1,2,3,4,5,[6],7]

    巧用reduce方法实现:

    有关reduce方法的使用方法和具体细节请看我的这篇文章:戳我传送

    1. const arr = [1,[2,3],[4,[5,[6]],7]];
    2. const flatten = (arr, deep = 1) => {
    3. if (deep <= 0) return arr;
    4. return arr.reduce((res, curr) => res.concat(Array.isArray(curr) ? flatten(curr, deep - 1) : curr), [])
    5. }
    6. console.log(flatten(arr, Infinity));//[1,2,3,4,5,6,7]
  • 相关阅读:
    Hadoop相关
    学术论文写作
    GO语言实战之嵌入类型和属性隐私定义
    经历网数据库共享
    使用 v-for 指令和数组来实现在 Uni-app 中动态增减表单项并渲染多个数据
    如何使用 LeiaPix 让照片动起来
    【浅学Java】哈希桶的模拟实现以及HashMap原码分析
    羧基修饰的聚苯乙烯微球(红色、橙色、绿色)的产品简介
    Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选
    软考系列(系统架构师)- 2017年系统架构师软考案例分析考点
  • 原文地址:https://blog.csdn.net/m0_65335111/article/details/127619861