0
点赞
收藏
分享

微信扫一扫

JavaScript之数组扁平化

janedaring 2022-01-10 阅读 76

参考资料

递归

let arr = [1,2,[3,[4,5,[6,7]],8],9];
function flatten(arr = []){
    let res = [];
    arr.forEach(v=>{
        if(Array.isArray(v)){
            res = res.concat(flatten(v)); // concat 不会改变数组
        }else{
            res.push(v);
        }
    })
    return res;
}
console.log(flatten(arr));

代码很简单,需要注意的是concat方法是不会改变原数组的。

reduce 处理

Array.prototype.reduce() - JavaScript | MDN (mozilla.org)

不得不说,reduce真的很方便。

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

扩展运算符

Array.prototype.some() - JavaScript | MDN (mozilla.org)

let arr = [1, 2, [3, [4, 5, [6, 7]], 8], 9];
function flatten(arr = []) {
    // 判断当前数组中是否嵌套数组
    while (arr.some((v) => Array.isArray(v))) { 
        arr = [].concat(...arr);// 这样可以解除一层的嵌套
        /* 
            [].concat(1,[2,3]) => [1,2,3]
          */
    }
    return arr;
}
console.log(flatten(arr));

toString

let arr = [1, "2", [3, [4, 5, [6, 7]], 8], 9, { a: 1 }];
function flatten(arr = []) {
    arr = arr.toString().split(",").map(v=>Number(v));
    return arr;
}
console.log(flatten(arr));

局限性非常大,对于里面是字符串,或者引用类型就会出错。

JSON + 正则

let arr = [1, "2", [3, [4, 5, [6, 7]], 8], 9, { a: 1 }];
arr = JSON.stringify(arr).replace(/\[|\]/g,'');
arr = `[${arr}]`;
// console.log(arr);
console.log(JSON.parse(arr));

ES6 的 Array.prototype.flat()

Array.prototype.flat() - JavaScript | MDN (mozilla.org)

返回值是一个新的数组

var newArray = arr.flat([depth])
let arr = [1, "2", [3, [4, 5, [6, 7]], 8], 9, { a: 1 }];
console.log(arr.flat(Infinity));
举报

相关推荐

0 条评论