Array.prototype.flat()

116 阅读1分钟

函数特点

  • 方法会移除数组中的空项
const ary = [1,2,3,,5];
ary.flat(); // [1,2,3,5]

函数用法

// depth 需要提取嵌套数组的结构深度,默认值为1,可传入Infinity展开任意深度的嵌套数组
//       若传入<=0的整数时将返回原数组
// 返回值:一个包含将数组与子数组中所有元素的新数组
Array.prototype.flat(depth);

使用场景

  • 移除数组中的空项
  • 扁平化多维数组
const ary = [1,2,[3,4]];
ary.flat(); // [1,2,3,4]
const ary2 = [1, [2], [3, [4]]];
ary2.flat(1); // [1,2,3,[4]]
const ary3 = [1,[2,[3,[4]]]];
ary3.flat(Infinity); // [1,2,3,4]

手写实现

  • 使用递归实现flat功能
const ary = [1,[2], [3, [4, 5, [6]]], [7], 8, 9];
function myFlat(list) {
    let result = [];
    list.forEach((item) => {
        if (Array.isArray(item)) {
            result = result.concat(arguments.callee(item)); // 递归
        } else {
            result.push(item);
        }
    });
    return result;
}
myFlat(ary); // [1,2,3,4,5,6,7,8,9]
  • 原型链上重写
const ary = [1,[2], [3, [4, 5, [6]]], [7], 8, 9];
Array.prototype.myFlat = function(num) {
    if (!Number(num) || Number(num) < 0) return this;
    let result = this.concat();
    while (num > 0) {
        if (result.some((v) => Array.isArray(v))) {
            result = [].concat.apply([], result);
        } else {
            break;
        }
        num--;
    }
    return result;
}
ary.myFlat(Infinity); // [1,2,3,4,5,6,7,8,9]
ary.myFlat(2); // [1,2,3,4,5,[6],7,8,9]
const ary = [1,[2], [3, [4, 5, [6]]], [7], 8, 9];
function myFlat(list) {
    const stack = [].concat(list);
    const result = [];
    while(stack.length) {
        // 出栈
        const next = stack.pop();
        if (Array.isArray(next)) {
            // 解构后入栈
            stack.push(...next);
        } else {
            // 非数组入栈
            result.push(next);
        }
    }
    // 反转恢复原数组的顺序
    return result.reverse();
}

myFlat(ary); // [1,2,3,4,5,6,7,8,9]