陣列的扁平化,就是將乙個巢狀多層的陣列(巢狀可以是任何層數)轉換為只有一層(或者指定層)的陣列。這個操作在實際開發過程還是有一定的需求場景的。在es6中已經提供了實現這個功能的方法,本文討論了模擬實現的方案。關鍵字:模擬實現 array.prototype.flat
本文介紹了es6中給陣列提供的flat
它的功能是把陣列扁平拉開及如何去模擬實現。
如果你已經知道了答案,或者暫時不想學習這個看起來沒有什麼實際用處的功能,你可以跳過哈。
•es6中flat功能介紹•tostring+split模擬實現•迴圈+遞迴實現
它的格式是:
var 新陣列 = 陣列.flat(level=1);
注意:
•它預設只扁平化一層:即把二維陣列展開成一組陣列;把三維陣列展開成二維陣列等。•如果希望展開指定的層數,則可以傳入乙個具體的數值;•如果希望一步到位,展開成最簡單的一維陣列,可以傳入infinity
下面的內容討論如何去模擬實現這個功能。[1, 2, [3, [4, 5]]].flat()
// 結果是:[1, 2, 3, [4, [5]]] 。
// 在保留最外層的情況下,把3前面的[去掉。
[1, 2, [3, [4, [5]]]].flat(2)
// 結果是:[1, 2, 3, 4, [5]] 。
// 在保留最外層的情況下,去掉裡面的兩層:把3,4前面的[去掉
[1, 2, [3, [4, [5]]]].flat(infinity)
// 結果是:[1, 2, 3, 4, 5]
// 展開成一維陣列
如果陣列的元素都是數字或者是字串(或者你不在意它們之間的區別),可以考慮使用 tostring 方法加上split方法。
整體分成兩步:
寫成函式就是:// 1.用陣列的tosting()把陣列轉成字串
[1,[2,[3,[4,[5,6]]]]].tostring();
// 得到:1,2,3,4,5,6
// 2.用字串的split()把字串還原成陣列
"1,2,3,4,5,6".split(",");
//得到:["1","2","3","4","5","6"]
注意:function yourflat(arr)
var arr = [1,[2,[3,[4,[5,6]]]]];
var arr1 = yourflat(arr)
console.log(arr1) // [1,2,3,4,5,6]
•這裡有乙個bug
:原陣列中的數值
被轉成字串
了。如果你不在意這個型別的問題,那你可以使用這種做法。或者根據實現需求,得到全字串元素的陣列之後再把其中的字串轉回成數值。
再進一步,使用箭頭函式來簡化一下**:
var yourflat = arr => arr.tostring().split(',')
對於arr這個要拉平的陣列來說,我們先從最簡單的二維情況說起,再拓展到多維的情況。
我們先把情況簡化一下:arr只是乙個二維陣列。思路就是:
第一步:定義乙個空陣列rs;
第二步:迴圈arr中的元素;
•如果當前元素arr[i]是陣列,則把arr[i]這個陣列中的全部元素新增到rs中。•如果當前元素arr[i]不是陣列,則這個元素新增到rs中。
第三步:返回rs;
注意:var arr = [1,2,3,4,[5,6]];
function yourflat(arr) else
}
return rs;
}
rs.push(...arr[i])
的用法。
解釋如下:push()方法用來把某些元素新增到陣列的最後面,它會修改原陣列,並且返回值是修改陣列後,陣列的長度。如果你希望一次性新增多個元素到陣列,可以寫成arr.push(x,y,z...)
這種格式,但是,如果你直接傳入乙個陣列的話,它會把整個陣列為乙個元素新增進去。
在陣列的前面加var arr = [1,2,3]
arr.push(4,5);
// 返回值是5,arr的狀態是[1,2,3,4,5]
arr.push([4,5])
// 返回值是4,arr的狀態是:[1,2,3,[4,5]]
...
是es6中給陣列新的乙個運算子,它就可以把陣列展開。
你也可以換乙個寫法:
rs = rs.concat(arr[i])
注意哈,別省略了賦值,而寫成了rs.concat(arr[i])
。原因是rs.concat()不會修改rs這個陣列,你必須重新賦值才可以儲存結果。
現在把情況搞複雜一些,從arr從二維陣列公升級成乙個多維陣列。那又該怎麼做呢?答案是:在迴圈的基礎上加上遞迴來處理。
思路是:
第一步:定義乙個空陣列rs;
第二步:迴圈arr中的元素;
•如果當前元素arr[i]是陣列,則遞迴
。•如果當前元素arr[i]不是陣列,則這個元素新增到rs中。
第三步:返回rs;
下面是**。
你還可以進一步用箭頭和陣列的reduce方法來改寫這個函式:function yourflat(arr) else
}
return rs;
}
var arr = [1,[2,[3,[4,[5,6]]]]];
var arr1 = yourflat(arr)
console.log(arr1) // [1,2,3,4,5,6]
var yourflat = arr => arr.reduce((prev, next)=>prev.concat(array.isarray(next) ? yourflat(next) : next), )
好的,你可以稍微想一想,如何對乙個多維陣列實現扁平到指定的層級?
下面的內容是參考**,我建議你自己先想一想。var arr = [1,[2,[3,[4,[5,[6]]]]]];
var arr1 = flat(arr,1);
// 期望結果:[1,2,[3,[4,[5,[6]]]]];
var arr2 = flat(arr,2);
// 期望結果:[1,2,3,[4,[5,[6]]]];
思路:第一步:定義乙個空陣列 rs;
第二步:迴圈arr中的元素;
•如果當前元素arr[i]是陣列
•再次判斷,是否達到扁平的級數
•否,則遞迴
。•是,新增到rs
•如果當前元素arr[i]不是陣列,則這個元素新增到rs中。
第三步:返回rs;
**如下:
注意到上面**中兩層if中的**有部分是重複的,稍微再優化一下:var yourflat = function(arr,level=1)else
} else
}
return rs;
}
如果用reduce改寫的話,是這樣:var yourflat = function(arr,level=1) else
}
return rs;
}
•本文討論了如何去陣列進行扁平化處理的兩種實現方法。•其實es6中已經提供了這個功能。•在著名的underscore[1]庫中也封裝這個功能。var yourflat = (arr,level=1)=>
arr.reduce((prev,next)=>prev.concat(level>1 && array.isarray(next) ? yourflat(next,level-1):next),);
js 陣列扁平化
陣列扁平化是指將乙個多維陣列變為一維陣列 遍歷陣列arr,若arr i 為陣列則遞迴遍歷,直至arr i 不為陣列然後與之前的結果concat 遍歷陣列每一項,若值為陣列則遞迴遍歷,否則concat。function flatten arr 1,2,3,4,5 1,2,3,4,5 2.1.reduc...
js陣列扁平化
所謂陣列扁平化,就是將乙個二維或多維陣列轉換為一維陣列。比如將 1,2 3,4,5 轉化為 1,2,3,4,5 1 首先想到設定乙個空陣列,如果原陣列中的每一項不是陣列,直接push進去,如果是陣列,就與這個空陣列進行連線 實現 let flatarr arr else return result ...
JS 陣列扁平化
假如有乙個陣列 var arr 1,2,3,4 我們怎麼能把arr變成 1,2,3,4 呢?即讓多維陣列降維,轉換為只有一層的陣列。1.迴圈陣列 遞迴 function flatten arr else return result flatten arr 1,2,3,4 var arr 1 2,3,...