數組扁平化

最近學習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實現數組扁平化,就沒有這麼簡單了
  1. reduce

我們用reduce函數進行遍歷,把pre的初值賦值爲[],如果當前的值是數組的話,那麼我們就查看他的孩子,如果當前的值不是數組,那麼我們就把它連進數組裏。

function flat(arr){
	return arr.reduce(function(pre,cur){
		        return pre.concat(Array.isArray(cur) ? flat(cur) : cur);
	},[])
}
  1. toString & split

我們用toString方法取出數組的值,然後把取出的值用split拆分爲數組,再用Number把數組中的每一個字符轉換爲數字

function flat(arr){
	arr.toString().split(',').map(function(item,index,arr){
		return Number(item)
	})
}
  1. join & split

和第二個方法的思想類似

function flatten(arr) {
    return arr.join(',').split(',').map(function(item) {
        return parseInt(item);
    })
}
  1. 遞歸

遞歸的遍歷每一項,若爲數組則繼續遍歷,否則concat

function flatten(arr) {
    var res = [];
    arr.map(item => {
        if(Array.isArray(item)) {
            res = res.concat(flatten(item));
        } else {
            res.push(item);
        }
    });
    return res;
}
  1. 擴展運算符

es6的擴展運算符能將二維數組變爲一維,當arr中存在元素是數組,那麼就要對arr使用一次拓展運算符進行降維。

function flatten(arr) {
    while(arr.some(item=>Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章