在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