js

JS 数组扁平化(多维转一维)

2021-09-07  本文已影响0人  Cherry丶小丸子
方法一:普通的递归
const arr = [1, [2, [3, [4, 5]]]];
const flatten = (arr) => {
    let result = [];
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            result = result.concat(flatten(arr[i]));
        } else {
            result.push(arr[i]);
        }
    }
    return result;
};
console.log(flatten(arr)); // [0, 1, 2, 3, 4, 5]
方法二:利用 reduce 函数迭代
// 利用 es5 的 arr.reduce(callback[, initialValue]) 实现

let arr = [[0, 1], [2, 3], [4, [5, 6, 7]]]
const flatten = (arr) => {
    return arr.reduce((pre, cur) => {
        return pre.concat(Array.isArray(cur) ? flatten(cur) : cur)
    }, []);
};
console.log(flatten(arr)); // [0, 1, 2, 3, 4, 5, 6, 7]


// 指定维数进行扁平
const arr = [1, 2, 3, 4, [5, 6, 7, [8, 9, 10, [11, 12, 13]]], 14, 'string', { name: '张铁蛋同学' }];
const flatten = (arr, num = 1) => {
    return arr.reduce((pre, cur) => {
        return pre.concat(Array.isArray(cur) ? flatten(cur, num - 1) : cur);
    }, []);
};
console.log(flatten(arr, 2)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Array(3), 14, 'string', {…}] 
方法三:利用扩展运算符和 map
let arr = [[1, 2], 3, [[[4], 5]]]
const flatten = (arr) => {
    return [].concat(...arr.map(x => Array.isArray(x) ? flatten(x) : x))
}
console.log(flatten(arr)) // [1, 2, 3, 4, 5]
方法四:利用 while 和 some 和 扩展运算符
let arr = [[1, 2], 3, [[[4], 5]]]
const flatten = (arr) => {
    while(arr.some(item =>  Array.isArray(item))){
        arr = [].concat(...arr);
    }
    return arr;
};
console.log(flatten(arr)); // [1, 2, 3, 4, 5]
方法五:split 和 toString 共同处理,但结果会变成字符串
let arr = [[1, 2], 3, [[[4], 5]]]
const flatten = (arr) => {
    return arr.toString().split(',')
};
console.log(flatten(arr)); // ['1', '2', '3', '4', '5']
方法六:利用 ES 的最新语法,Array.prototype.flat(),缺点是有兼容性问题,优点是非常简单
flat() 方法会递归到指定深度将所有子数组连接,并返回一个新数组。
语法:`let newArray = arr.flat(depth)`,参数说明:depth,可选,指定嵌套数组中的结构深度,默认值为1。

const arr = [1, [2, [3, [4, 5]]]];
const flatten = (arr) => {
    return arr.flat(Infinity)
};
console.log(flatten(arr)); // [1, 2, 3, 4, 5]

特殊说明:flat()方法会移除数组中的空项,但 undefined、null 仍会保留
let arr = [1, 2, , undefined, 4, 5, null];
arr.flat(); // [1, 2, undefined , 4, 5, null]
二维转一维
第一种

let arr = [[0, 1], [2, 3], [4, 5]];
let arr1 = [].concat.apply([], arr);
console.log(arr1) // [0, 1, 2, 3, 4, 5]



第二种
let arr = [[0, 1], [2, 3], [4, 5]];
let arr1 = arr.reduce((a, b) => a.concat(b));
console.log(arr1) // [0, 1, 2, 3, 4, 5]
上一篇下一篇

猜你喜欢

热点阅读