1
| const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
|
有这么一个数组,要对该数组进行扁平化操作,自己总结了以下几个方法:
- 数组的原生方法
该方法虽然非常简洁,但是浏览器兼容性很差。
- 递归
1 2 3 4 5 6 7 8 9 10 11
| function flat(arr) { let flattenArr = []; arr.forEach(item => { if (Array.isArray(item)) { flattenArr = flattenArr.concat(flat(item)) } else { flattenArr.push(item); } }) return flattenArr; }
|
- 非递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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 类型, 所以可以使用以下方法。
1 2
| arr.join(',').split(',').map(Number); arr.toString().split(',').map(Number);
|
如果都是 Boolean 类型,如:
1
| const arr = [ true, [false, true, [false, true] ] ];
|
则可以扁平化如下:
1 2
| arr.join(',').split(',').map(JSON.parse); arr.toString().split(',').map(JSON.parse);
|
注:不适用于对象等复杂类型的对象
