ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用JavaScript 实现 Array.flat()方法

2021-07-12 23:57:31  阅读:227  来源: 互联网

标签:flat arr JavaScript item 数组 reArr Array


Array.flat()介绍

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。使用 Array.flat(depth)可以实现数组的扁平化

参数

        depth 可选(指定要提取嵌套数组的结构深度,默认值为 1)

返回值

                一个包含将数组与子数组中所有元素的新数组。(所有和原数组没有关系,不会影响到原数组)

下面看代码实现:

首先:不看depth,不考虑深度问题。

将实现方法加到 Array的原型上面,遍历数组,如果是数组类型就使用递归方法flat(),不是数组就push到 reArr中。遍历完成返回数组,返回的数组就是扁平化以后的数组。

Array.prototype.flatArr = flatArr
function flatArr(){
    let arr = this
    let reArr = []
    const flat = (arr) => {
        arr.forEach((item) => {
            if(Object.prototype.toString.call(item).slice(8,-1) === 'Array') {
                flat(item)
            } else {
                reArr.push(item)
            }
        })
    }
    flat(arr)
    return reArr
}
let arr = [1,2,[3,4],[10,[11,12]],[5,[6,[7,[8,[9]]]]]]
// 不考虑深度的实现
console.log(arr.flatArr())   // [1, 2, 3, 4, 10, 11, 12, 5, 6, 7, 8, 9]
// 原生方法
console.log(arr.flat(Infinity)) // [1, 2, 3, 4, 10, 11, 12, 5, 6, 7, 8, 9]

现在,在加上扁平化的深度,需要加一个depNum参数,在遍历过程中,如果子项是数组的话就比较一下depNum的大小和传入的大小。如果更小就将depNum加1,然后可以继续递归,如果大了就直接把这个子项push到 reArr中。需要注意的是,当遍历完成一个子项后要把 depNum清 0

/**
 * 实现 Array.flat() 方法
 * 
 */
Array.prototype.flatArr = flatArr
function flatArr(depth = 1){
    let arr = this
    let reArr = []
    let depNum = 0
    const flat = (arr) => {
        arr.forEach((item,index,array) => {
            if(Object.prototype.toString.call(item).slice(8,-1) === 'Array') {
                if(depNum < depth) {
                    depNum++
                    flat(item)
                } else {
                    reArr.push(item)
                    if(index === array.length -1) depNum = 0;
                }
            } else {
                reArr.push(item)
                if(index === array.length -1) depNum = 0;
            }
        })
    }
    flat(arr)
    return reArr
}
let arr = [1,2,[3,4],[10,[11,12]],[5,[6,[7,[8,[9]]]]]]
// let arr = [[1], [1,2,[2]], [3,4]]
console.log(arr.flatArr(3))  // [1, 2, 3, 4, 10, 11, 12, 5, 6, 7, Array(2)]
//原生方法
console.log(arr.flat(3))    // [1, 2, 3, 4, 10, 11, 12, 5, 6, 7, Array(2)]

标签:flat,arr,JavaScript,item,数组,reArr,Array
来源: https://blog.csdn.net/Wrj6811/article/details/118686404

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有