Safari11 es6 Array.prototype.flat()方法兼容

1,483 阅读1分钟

遇到一个坑,在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来实现了