解决 ES8 Array.prototype.flat() 在部分浏览器中不支持嵌套数组拍平的兼容性问题

在ES8中新增加了 Array.prototype.flat() 方法来把嵌套数组(nested array)拍平到指定的 depth 层次。但是,这个方法在部分浏览器中不被支持,这就导致了新写的代码不能兼容于所有浏览器。本文将会详细的讨论这个问题并提供解决方法。

兼容性问题

Array.prototype.flat() 是在ES8新增的,因此早期浏览器不支持。(查看Can I Use)。具体而言,Internet Explorer 是不支持这个方法的,而IE的版本范围是相对宽泛的。

解决方法

有一个解决兼容性问题的方法就是自己编写一个 flat() 函数,这个函数可以像 Array.prototype.flat() 一样来拍平数组的嵌套层次。

以下是一个把嵌套数组拍平到指定深度的JS函数:

function flat(arr, depth = 1) {
  return depth > 0
    ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flat(val, depth - 1) : val), [])
    : arr.slice();
}

这个函数的实现思路其实与 Array.prototype.flat() 基本相同:遍历嵌套的数组,递归找到所有子数组,在达到深度的时候停止递归,将所有值取出来把他们返回。

举个例子,假设有一个嵌套的三维数组:

const nested = [1, [2, [3, 4]], 5];

如果我们执行以下代码就可以将它拍平:

console.log(flat(nested)); // [1, 2, 3, 4, 5]

我们也可以使用 flat(nested, 1) 函数,只拍平嵌套数组的第一层:

console.log(flat(nested, 1)); // [1, 2, [3, 4], 5]

总结

Array.prototype.flat() 是一个很有用的方法,但是因为在老旧的浏览器中不被支持的话,我们需要自己编写如何实现flat() 的函数。我们在本文中给出了一个实现方法来解决这个兼容性问题。现在我们已经知道如何通过递归来拍平一个数组,并使用该函数来处理所有层级的嵌套数组。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b5d51fadd4f0e0ffe92c4c