js陣列操作 陣列扁平化

2021-10-10 22:23:51 字數 4359 閱讀 2859

陣列的扁平化,就是將乙個巢狀多層的陣列(巢狀可以是任何層數)轉換為只有一層(或者指定層)的陣列。這個操作在實際開發過程還是有一定的需求場景的。在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;

下面是**。​​​​​​​

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]
你還可以進一步用箭頭和陣列的reduce方法來改寫這個函式:

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;

**如下:​​​​​​​

var yourflat = function(arr,level=1)else} else}return rs;}
注意到上面**中兩層if中的**有部分是重複的,稍微再優化一下:​​​​​​​

var yourflat = function(arr,level=1) else}return rs;}
如果用reduce改寫的話,是這樣:​​​​​​​

var yourflat = (arr,level=1)=>arr.reduce((prev,next)=>prev.concat(level>1 && array.isarray(next) ? yourflat(next,level-1):next),);
•本文討論了如何去陣列進行扁平化處理的兩種實現方法。•其實es6中已經提供了這個功能。•在著名的underscore[1]庫中也封裝這個功能。

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,...