数组扁平化的几种实现方式

数组扁平化是什么?

数组扁平化是指将一个多维数组转化为一维的数组
如:
在这里插入图片描述

在这里插入图片描述

基本实现步骤:
1.对数组每一项进行遍历
2.判断该项是否是数组
3.如果该项不是数组,则将其直接放进新数组
4.是数组返回1,继续迭代
5.当数组遍历完成,返回新数组

一、递归

遍历过程中,遇到是数组的项,继续调用扁平函数对其进行迭代,直到最后不是数组的一层,将数值添加进res数组中

Array.prototype.flat = function() {
    let res = [];
    let len = this.length;
    //遍历数组
    for (let i = 0; i < len; i++) {
    //判断是否是数组
        if (Array.isArray(this[i])) {
        //是数组调用扁平函数继续判断
            res = res.concat(this[i].flat())
        } else {
            res.push(this[i])
        }
    }
    return res
}
var acc = [1, 2, 3, [4, 5, 'hello', ['world', 9, 666]]]
console.log(acc.flat());

二、利用reduce函数迭代

使用reduce函数遍历数组,reduce方法第一个参数为最后累加的结果,第二个参数为遍历的当前项,对迭代到的当前项进行正则判断,分两种情况,当检测到的是普通项,则用concat添加进prev中,当是数组时,对该项执行扁平函数继续进行迭代。

const flat = (arr) => {
    //第一个参数返回最后累加的结果
    return arr.reduce((prev, item) => {
        return prev.concat(Array.iaArray(item) ? flat(item) : item)
    }, [])
}
var a = [1, 2, 3, [4, 5, 'hello', ['world', 9, 666]]]
console.log(flat(a));

三:拓展运算符实现

使用一个while循环遍历数组,利用some方法将数组中的数组项过滤出来,利用ES6展开运算符,将其拼接进原数组。

const flat = (arr) => {
    while (arr.some(item => Array.isArray(item))) {
        //使用some方法把数组中仍是数组的项过滤出来,执行concat操作,
        //利用ES6展开运算符,将其拼接到原数组中,最后返回原数组
        arr = [].concat(...arr);
    }
    return arr;
}
var a = [1, 2, 3, [4, 5, 'hello', ['world', 9, 666]]]
console.log(flat(a));

四:split和toString共同处理

使用toString()方法将数组中的元素全部转化为用一个逗号隔的字符串形式,用split()方法将其转化为数组。

const flat = (arr) => {
    return arr.toString().split(',')
};
const a = [1, 2, 3, [2, 3],
    [4, 5, [8, 9]]
]
console.log(flat(a));

五:调用ES6中的flat

Infinity表示签嵌套的字符串层数,在数组层数不确定的时候,最好直接使用Infinity

const a = [1, 2, 3, [2, 3],
    [4, 5, [8, 9]]
]
const flatten = (arr) => {
    return arr.flat(Infinity)
};

console.log(flatten(a));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值