1 var arr=[1,2,3,[4,5],[6,[7,[8]]]]
2 /**
3 * 使用递归的方式处理
4 * wrap内保存结果ret
5 * 返回一个递归函数
6 *
7 * @returns
8 */
9 function wrap(){
10 var ret=[];
11 return function flat(a){
12 for(var item of a){
13 if(item.constructor===Array){
14 ret.concat(flat(item))
15 }else{
16 ret.push(item)
17 }
18 }
19 return ret
20 }
21 }
22 console.log(wrap()(arr));
1 const spreadableSymbol = Symbol.isConcatSpreadable
2 const isFlattenable = (value) => {
3 return Array.isArray(value) || (typeof value == 'object' && value !== null
4 && Object.prototype.toString.call(value) === '[object Arguments]') ||
5 !!(spreadableSymbol && value && value[spreadableSymbol])
6 }
7
8 /**10 * @param array 需要展开的数组
11 * @param depth 展开深度
12 * @param predicate 迭代时需要调用的函数
13 * @param isStrict 限制通过`predicate`函数检查的值
14 * @param result 初始结果值
15 * @returns {Array} 返回展开后的数组
16 */
17 function flatten(array, depth, predicate, isStrict, result) {
18 predicate || (predicate = isFlattenable)
19 result || (result = [])
20
21 if (array == null) {
22 return result
23 }
24
25 for (const value of array) {
26 if (depth > 0 && predicate(value)) {
27 if (depth > 1) {
28 flatten(value, depth - 1, predicate, isStrict, result)
29 } else {
30 result.push(...value)
31 }
32 } else if (!isStrict) {
33 result[result.length] = value
34 }
35 }
36 return result
37 }
38
39 flatten([1, 2, 3, [4, 5, [6]]], 2)
1 let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]
2
3 const flatten = function (arr) {
4 while (arr.some(item => Array.isArray(item))) {
5 arr = [].concat(...arr)
6 }
7 return arr
8 }
9
10 console.log(flatten(arr))
11
12 const flatten = array => array.reduce((acc, cur) => (Array.isArray(cur) ? [...acc, ...flatten(cur)] : [...acc, cur]), [])
1 let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]
2 /*
3 *迭代实现
4 */
5 function flatten(arr) {
6 let arrs =[...arr]
7 let newArr = [];
8 while (arrs.length){
9 let item = arrs.shift()
10 if(Array.isArray(item)){
11 arrs.unshift(...item)
12 }else {
13 newArr.push(item)
14 }
15 }
16 return newArr
17 }
18 /*
19 *递归实现
20 */
21 function flatten(arr) {
22 let arrs = [];
23 arr.map(item => {
24 if(Array.isArray(item)){
25 arrs.push(... flatten(item))
26 } else {
27 arrs.push(item)
28 }
29 })
30 return arrs
31 }
1 /*切割字符串*/
2 arr.join(',').split(',').map(item => Number(item)))
1 使用Generator实现数组flatten:
2
3 function* flat(arr){
4 for(let item of arr){
5 if(Array.isArray(item)){
6 yield* flat(item);//Generator委托
7 }else {
8 yield item
9 }
10 }
11 }
12 function flatten(arr) {
13 let result = [];
14 for(let val of(flat(arr))){
15 result.push(val);
16 }
17 return result;
18 }
19 let arr1 = [1,[2,3,[4,5],6],[7]];
20 console.log(flatten(arr1));//[1, 2, 3, 4, 5, 6, 7]
1 const arr = [1,2,3,[4,5],6,[7,[8, 9, 10]]]
2
3 // 递归
4 function flatten(arr, res = []) {
5 for (let i = 0; i < arr.length; i++) {
6 if (typeof arr[i] === 'object') {
7 flatten(arr[i], res);
8 } else {
9 res.push(arr[i]);
10 }
11 }
12 return res;
13 }
14
15 // 队列
16 function flatten1(arr) {
17 const newArr = [...arr];
18 const res = [];
19 while (newArr.length) {
20 const item = newArr.shift(); // 出队
21 if (Array.isArray(item)) {
22 newArr.unshift(...item); // 入队
23 } else {
24 res.push(item);
25 }
26 }
27 return res;
28 }
1 /*@param {Array} arr 需要扁平化的数组
2 @param {Number} [depth=1] 扁平化深度
3 @return {Array} 扁平化后的新数组
4 */
5 function flatten(arr, depth = 1) {
6 return arr.reduce((newArr, nextArr) => newArr.concat(depth > 1 && Array.isArray(nextArr) ? flatten(nextArr, depth - 1) : nextArr), [])
7 }
1 function flatten(arr) {
2 const result = [...arr];
3 for (let i = 0; i < result.length; i++) {
4 const item = result[i]
5 if (Array.isArray(item)) {
6 Array.prototype.splice.apply(result, [i, 1, ...item])
7 i--
8 }
9 }
10 return result
11 }