tags: [javascript]
const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
有这么一个数组,要对该数组进行扁平化操作,自己总结了以下几个方法:
- 数组的原生方法
arr.flat(Inifity); // Inifity 可以扁平化任意嵌套层数的数组
该方法虽然非常简洁,但是浏览器兼容性很差。
- 递归
function flat(arr) {let flattenArr = [];arr.forEach(item => {if (Array.isArray(item)) {flattenArr = flattenArr.concat(flat(item))} else {flattenArr.push(item);}})return flattenArr;}
- 非递归
function flat(arr) {const flattenArr = [];for(let i = 0;i<arr.length;i++) {const stack = [];if (Array.isArray(arr[i])) {stack.push(arr[i]);} else {flattenArr.push(arr[i]);}while(stack.length) {const newArr = stack.pop();for(let i = 0;i<newArr.length;i++) {if (Array.isArray(newArr[i])) {stack.push(newArr[i]);} else {flattenArr.push(newArr[i]);}}}}return flattenArr;}
- 擦边球方法
因为数组中的元素比较特殊,都是 Number 类型, 所以可以使用以下方法。
arr.join(',').split(',').map(Number);arr.toString().split(',').map(Number);
如果都是 Boolean 类型,如:
const arr = [ true, [false, true, [false, true] ] ];
则可以扁平化如下:
arr.join(',').split(',').map(JSON.parse);arr.toString().split(',').map(JSON.parse);
注:不适用于对象等复杂类型的对象

