//判断是不是数组 let isArr = (arr) => (arr instanceof Array) //判断是否一维数组 let isTdim = (arr) => arr.reduce((o1, o2) => o1&&!isArr(o2), true) //多维数组变一维数组 let flat = (arr) => isTdim(arr) ? arr : flat(Array.prototype.concat.apply([],arr))
这里apply
函数接受的arr
数组个数若是太过会出现问题。在node上测试,120000之内均可以,大于130000,就报错了。chrome上会高一点。node
function name() { var a = [] for (var i = 0; i < 11; i++) { a[i] = function(){return i} } return a } console.log(name()[0]())
上面这个函数会输出意外的结果:11.这里再也不费力地解释为何会出现这种反人性的结果。只是给出正确而不拗口的写法,只要把var
变成let
就能够了chrome
function name() { var a = [] for (let i = 0; i < 11; i++) { a[i] = function(){return i} } return a } console.log(name()[0]())
若是你担忧浏览器不支持let
,那就用babel转一下,babel会把let转换成var而不出现做用域提高的问题。数组