虽然ES6中有个Array.prototype.flat()
方法来解决数组扁平化的问题,但是近期面试的时候,面试官非要让你手写个函数来实现数组扁平化,所以整理了几个简单的数组扁平化方法。
方法1(ES6)
arr.flat(x)//ES6方法很简单有木有?flat后边的参数x默认为空,默认只能处理一层扁平化,大家可以根据嵌套的层数去写。
复制代码
方法2(数组reduce方法结合递归)
function flatten(arr) {
return arr.reduce((result, item) => {
return result.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
复制代码
方法3 (toString 和 split)
function flatten(arr) {
console.log(arr.toString())//12,3,4,5,6,7,8,10,9,10
console.log(arr.toString().split(','))//["12", "3", "4", "5", "6", "7", "8", "10", "9", "10"]
return arr.toString().split(',').map(function (item) {
return Number(item);
})
}
复制代码
方法4( join 和 split,类似方法三)
function flatten(arr) {
return arr.join(',').split(',').map(function(item) {
return Number(item);
})
}
复制代码
方法3和方法4的思路:通过join()
或者toString()
,先将原数组转化为字符串,然后通过split()
将字符串分割为数组,但是此时分割好的数组每一项都是字符串,所以通过Number()
映射为数字类型。
方法5(递归函数)
function flatten(arr) {
let newAry = [];
for (let i in arr) {
if (arr[i] && typeof arr[i] == "object") {
newAry = newAry.concat(flatten(arr[i]))
} else {
newAry.push(arr[i])
}
}
return newAry
}
复制代码