遇到一个坑,在Safari11里数组的es6方法flat()报错[].flat() is not a function.
猜想是Safari11中数组原型不支持这个方法。
flat()方法是将多维数组平铺成一维数组
let arr = [1,2,3,4,[5,6,7]].flat();
console.log(arr); // [1,2,3,4,5,6,7]
我们可以用es5代码写一个简单的方法来替换flat()
Array.prototype.flat_es5 = function () {
var all = [];
for (var i = 0; i < this.length; i++) {
if (Object.prototype.toString.call(this[i]) !== '[object Array]') {
all.push(this[i]);
} else {
all = all.concat(this[i].flat_es5())
}
}
return all;
}
var testArr = [1,2,3,4,5,[6,7,8,[9,10,11,[12]]]].flat_es5();
console.log(testArr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
其中获取数据类型的方法Object.prototype.toString.call()可以用Array.isArray()来判断,但既然当前浏览器已经不支持.flat()了,那么对其他ES6的语法支持也不能信任,所以全部的代码都使用es5来实现了