IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 使用JavaScript 实现 Array.flat()方法 -> 正文阅读

[JavaScript知识库]使用JavaScript 实现 Array.flat()方法

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)]

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:22:27  更:2021-07-13 17:22:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 3:40:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码