2019年的ES10中新增了扁平化API flat
①flat实现指定深度的数组扁平化
function flatten6(arr,depth = 1) { if (!Array.isArray(arr)) return [] if(typeof depth !== 'number') depth = 1 let curDepth = 1 function flat(arr,curDepth){ return Array.prototype.reduce.call(arr, (total, cur) =>{ // 无需扁平化的场景: 超过深度阈值 或 当前元素非数组 if(curDepth > depth || !Array.isArray(cur)){ total.push(cur) return total }else{ curDepth ++ return total.concat(flat(cur,curDepth)) } } , []) } return flat(arr,curDepth) }
②普通的递归实现
const a = [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(a));
③利用reduce函数迭代
const flatten = (arr) => { return arr.reduce((prev,next)=>{ return prev.concat(Array.isArray(next)?flatten(next):next) },[]); }; console.log(flatten(a));
④扩展元素符实现 some some会返回一个boolea值
const flatten = (arr) => { while(arr.some(item=>Array.isArray(item))){ arr = [].concat(...arr); } return arr; }; console.log(flatten(a));
⑤es6的flat 深度最好使用Infinity
const a = [1, [2, [3, [4, 5]]]]; const flatten = (arr) => { return arr.flat(Infinity) }; console.log(flatten(a));
⑥使用split和toString共同处理 split是字符串的方法 不是数组的那个splice方法
const flatten = (arr) => { return arr.toString().split(',') }; console.log(flatten(a));
通过这两个方法可以将多维数组直接转换成逗号连接的字符串,然后再重新分隔成数组
⑦用正则和JSON来处理
const flatten = (arr) => { let str = JSON.stringify(arr); str = str.replace(/(\[|\])/g,''); str = `[${str}]`; return JSON.parse(str); }; console.log(flatten(a));
标签:多种,arr,return,扁平化,flat,curDepth,flatten,数组,const From: https://www.cnblogs.com/alwaysrun/p/17179784.html