重写JS之数组扁平化

35 阅读1分钟

数组扁平化,之前面试经常问的一个问题。废话不多说。方法有很多,这里说四种。为了方便记录,这里代码都在最后。 方法有:

  1. 递归
  2. toString 方法,缺点 number类型数组也会转换为string类型
  3. reduce 方法
  4. 学习undercore
let arr = [1,'2',3,4, [5,6,7,[8,9,[10,11]]]]

function 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(arr));
/**
 * 
 * [
        1,  '2', 3, 4,  5,  6,
        7,  8,   9, 10, 11, 12,
        13
   ]
 */


// 2. toString 方法
console.log(arr.toString()); // 1,2,3,4,5,6,7,8,9,10,11,12,13

// 3 reduce 
function reduceFlatten(arr) {
    return arr.reduce((pre, cur) => {
        console.log(pre, cur);
        return pre.concat(Array.isArray(cur) ? reduceFlatten(cur) : cur)
        
    }, [])
}
console.log(reduceFlatten(arr));
/**
 * 
    [
      1,  '2', 3, 4,  5,  6,
      7,  8,   9, 10, 11, 12,
      13
    ]
 */


 // 4   undercore

 /**
  * 
  * @param {*} input 输入
  * @param {*} shallow 是否浅拷贝
  * @param {*} strict   是否严格模式
  * @param {*} output 输出
  */
 function undercoreFlatten(input, shallow, strict, output) {
    output = output || []; // 递归的时候会用到output,和第一种resutl 一样,所以需要初始化
    var idx = output.length; // 输出的长度

    for (let i = 0; i < input.length; i++) {
        const value = input[i]; // 遍历的当前元素
        if(Array.isArray(value)) {
            // 如果是数组,就递归调用
            // 1. 是否浅拷贝
            if(shallow) {
                var j = 0;
                var length = value.length;
                while(j < length) {
                    output[idx++] = value[j++];
                }
            }else {
                undercoreFlatten(value, shallow, strict, output)
            }
        }else if(!strict) {
            output[idx++] = value;
        }
        
    }

    return output;
 }

 console.log(undercoreFlatten(arr, true, true), );
 console.log(undercoreFlatten(arr, false, true), );
 console.log(undercoreFlatten(arr, false, false), ); 
 console.log(undercoreFlatten(arr, true, false), );
 /**
    [ 5, 6, 7, [ 8, 9, [ 10, 11 ] ] ] 
    [] 
    [
      1,  '2', 3, 4, 5,
      6,  7,   8, 9, 10,
      11
    ] 
    [ 1, '2', 3, 4, 5, 6, 7, [ 8, 9, [ 10, 11 ] ] ] 
  */