数组扁平化

本文详细介绍多种数组扁平化技术,包括适用于二维数组的Array.prototype.flat、reduce归并、map递归、循环遍历、扩展运算符、toString与split、join与split等方法,帮助开发者掌握高效数组操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组扁平化

数组扁平化是指将多维数组降维成一维数组

方式有很多,下面列举出几种常用的方法

方法

适用于二维数组的扁平化

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
const newArr = [].concat.apply([], arr);
console.log(newArr); //[1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

该转换方法只适用于二维数组,concat用于连接数组,apply([], arr)的第一个参数是改变this指向的,第二个参数是用于传递参数的,要求是一个数组,apply会将数组中的元素转换为参数列表。传递后的参数将会拼接到空数组中

Array.prototype.flat(depth)

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

由于不确定数组的深度,因为可以用关键字Infinity来展开任意深度的数组

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
const newArr = arr.flat(Infinity);
console.log(newArr); //[1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

reduce() 归并

用reduce方法进行遍历,把pre的初始值赋为[]。如果当前的值还为数组,则继续递归遍历它的子元素;如果当前的值不是数组,就直接拼接

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
function flat (arr) {
    return arr.reduce((prev, cur) => {
        return prev.concat(Array.isArray(cur) ? flat(cur) : cur);
    }, [])
}
const newArr = flat(arr);
console.log(newArr); //[1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

map() 递归

递归的遍历每一项,若为数组则继续遍历,不是数组就进行连接

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
function flat(arr) {
    let result = [];
    arr.map(item => {
        Array.isArray(item) ? result = result.concat(flat(item)) : result.push(item);
    });
    return result;
}
const newArr = flat(arr);
console.log(newArr); //[1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

循环 + 遍历

利用for循环以及遍历整个数组,若子元素为一个数组,就继续遍历,不是数组就添加进新数组

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
function flat(arr) {
    let result = [];
    for(let i = 0; i < arr.length; i++) {
        Array.isArray(arr[i]) ? result = result.concat(flat(arr[i])) : result.push(arr[i]);
    }
    return result;
}
const newArr = flat(arr);
console.log(newArr); //[1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

…扩展运算符

…可用于获取参数对象的所有可遍历属性

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
function flat(arr) {
    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}
const newArr = flat(arr);
console.log(newArr); //[1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

toString() 和 split()

利用数组的toString方法,将数组变为字符串,再用split分割后将字符串还原为数组。不过这种方法只适用于纯数字的数组,因为后面还需要将字符串转换为数字

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
function flat(arr) {
    return arr.toString().split(',').map(item => {
        return Number(item);
    })
}
const newArr = flat(arr);
console.log(newArr); // [1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]

join() 和 split()

与上面的方法一样,join也可以将数组转换为字符串,然后用split转换为数组,但也需要进行一次类型的转换。

const arr = [1,2,[2,1],[3,4,5],[1,1,2,3,4,5,6]];
function flat(arr) {
    return arr.join(',').split(',').map(item => {
        return Number(item);
    })
}
const newArr = flat(arr);
console.log(newArr); // [1, 2, 2, 1, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值