数组扁平化

64 阅读1分钟

定义: 将一个嵌套多层的数组转换为只有一层的数组

1.arr.flat([depth]) 其中depth是flat 的参数,表示数组的展开深度(默认不填、数值是1),即展开一层数组。Infinity,代表不论多少层都要展开。

     var arr = [1, [2, [4, [5, [6]]]]]
    function flatten(ary) {
        return ary.flat(Infinity)
    }
    console.log(flatten(arr))	// [1,2,3,4,5,6]
  1. 扩展运算符
var arr = [1, [2, [4, [5, [6]]]]]
        var arr1 = [
            {
                name:'张三'
            },
            [
                {
                    name:'李四'
                },
                {
                    name:'王五'
                }
            ]
        ]
        function flatten2(ary) {
            while(ary.some(item => Array.isArray(item))) {
                ary = [].concat(...ary)
            }
            return ary
        }
        console.log(flatten2(arr))  // [1,2,3,4,5,6]
        console.log(flatten2(arr1))  // ['[object Object]', '[object Object]', '[object Object]']

3.递归

 var arr = [1,[2,[4,[5,[6]]]]]
        function flatten(ary) {
            let res = []
            ary.forEach(item => {
                if (Array.isArray(item)) {
                    res = res.concat(flatten(item))
                } else {
                    res.push(item)
                }
            });
            return res
        }
        console.log(flatten(arr))

4.reduce

      var arr = [1, [2, [4, [5, [6]]]]]
       function flatten(ary){
            return ary.reduce((res, num) => {
                return res.concat(Array.isArray(num) ? flatten(num) : num)
            },[])
       }
       console.log(flatten(arr))

5.toString和split,缺点:元素类型会被转为字符串类型

var arr = [1, [2, [4, [5, [6]]]]]
function flatten(arr) {
	return arr.toString().split(',')
}
console.log(flatten(arr))	// ['1','2','3','4','5','6']

6 JSON 和正则表达式

  var arr = [1, [2, [4, [5, [6]]]]]
        function flatten(arr) {
            const str = '[' + JSON.stringify(arr).replace(/(\[|\])/g, '') + ']'
            return JSON.parse(str)
        }
        console.log(flatten(arr))