最近學習es6,發現了一個東西很有意思
Array.prototype.flat()
用於將嵌套的數組“拉平”,變成一維的數組。該方法返回一個新數組,對原數據沒有影響。
- 當沒有參數時,flat默認只會“拉平”一層
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
- 當參數存在時,flat會拉平指定的層數
[12,[2,[3]]].flat(1)
(3) [12, 2, Array(1)]
[12,[2,[3]]].flat(2)
//(3) [12, 2, 3]
- 如果不管有多少層嵌套,都要轉成一維數組,可以用Infinity關鍵字作爲參數。
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
- 如果用es5實現數組扁平化,就沒有這麼簡單了
- reduce
我們用reduce函數進行遍歷,把
pre
的初值賦值爲[],如果當前的值是數組的話,那麼我們就查看他的孩子,如果當前的值不是數組,那麼我們就把它連進數組裏。
function flat(arr){
return arr.reduce(function(pre,cur){
return pre.concat(Array.isArray(cur) ? flat(cur) : cur);
},[])
}
- toString & split
我們用
toString
方法取出數組的值,然後把取出的值用split
拆分爲數組,再用Number
把數組中的每一個字符轉換爲數字
function flat(arr){
arr.toString().split(',').map(function(item,index,arr){
return Number(item)
})
}
- join & split
和第二個方法的思想類似
function flatten(arr) {
return arr.join(',').split(',').map(function(item) {
return parseInt(item);
})
}
- 遞歸
遞歸的遍歷每一項,若爲數組則繼續遍歷,否則
concat
function flatten(arr) {
var res = [];
arr.map(item => {
if(Array.isArray(item)) {
res = res.concat(flatten(item));
} else {
res.push(item);
}
});
return res;
}
- 擴展運算符
es6的擴展運算符能將二維數組變爲一維,當
arr
中存在元素是數組,那麼就要對arr使用一次拓展運算符進行降維。
function flatten(arr) {
while(arr.some(item=>Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}