tags: [javascript]


    1. const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];

    有这么一个数组,要对该数组进行扁平化操作,自己总结了以下几个方法:

    1. 数组的原生方法
    1. arr.flat(Inifity); // Inifity 可以扁平化任意嵌套层数的数组

    该方法虽然非常简洁,但是浏览器兼容性很差。

    1. 递归
    1. function flat(arr) {
    2. let flattenArr = [];
    3. arr.forEach(item => {
    4. if (Array.isArray(item)) {
    5. flattenArr = flattenArr.concat(flat(item))
    6. } else {
    7. flattenArr.push(item);
    8. }
    9. })
    10. return flattenArr;
    11. }
    1. 非递归
    1. function flat(arr) {
    2. const flattenArr = [];
    3. for(let i = 0;i<arr.length;i++) {
    4. const stack = [];
    5. if (Array.isArray(arr[i])) {
    6. stack.push(arr[i]);
    7. } else {
    8. flattenArr.push(arr[i]);
    9. }
    10. while(stack.length) {
    11. const newArr = stack.pop();
    12. for(let i = 0;i<newArr.length;i++) {
    13. if (Array.isArray(newArr[i])) {
    14. stack.push(newArr[i]);
    15. } else {
    16. flattenArr.push(newArr[i]);
    17. }
    18. }
    19. }
    20. }
    21. return flattenArr;
    22. }
    1. 擦边球方法

    因为数组中的元素比较特殊,都是 Number 类型, 所以可以使用以下方法。

    1. arr.join(',').split(',').map(Number);
    2. arr.toString().split(',').map(Number);

    如果都是 Boolean 类型,如:

    1. const arr = [ true, [false, true, [false, true] ] ];

    则可以扁平化如下:

    1. arr.join(',').split(',').map(JSON.parse);
    2. arr.toString().split(',').map(JSON.parse);

    注:不适用于对象等复杂类型的对象

    image.png