日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
精學(xué)手撕系列——數(shù)組扁平化

 今天就帶大家從0了解flat特性到手寫實現(xiàn)flat,再到接住面試官的連環(huán)追問中重新學(xué)習(xí)一遍數(shù)組扁平化flat方法

Array.prototype.flat()
一段代碼總結(jié)Array.prototype.flat()特性

注:數(shù)組拍平方法 Array.prototype.flat() 也叫數(shù)組扁平化、數(shù)組拉平、數(shù)組降維。

 
 
 
  1. let arr = [12, 23, [34, 56, [78, 90, 100, [110, 120, 130]]]];
  2. console.log(arr.flat()); 
  3. // [ 12, 23, 34, 56, [ 78, 90, 100, [ 110, 120, 130 ] ] ]
  4. console.log(arr.flat(2));
  5. // [ 12, 23, 34, 56, 78, 90, 100, [ 110, 120, 130 ] ]
  6. console.log(arr.flat(Infinity));
  7. // [12, 23, 34, 56, 78, 90, 100, 110, 120, 130]
  8. console.log(arr.flat(0));
  9. // [12, 23, [34, 56, [78, 90, 100, [110, 120, 130]]]];
  10. console.log(arr.flat(-10));
  11. // [12, 23, [34, 56, [78, 90, 100, [110, 120, 130]]]];
  12. let arr2 = [12, 23, [34, 56, ,]]
  13. console.log(arr.flat());
  14. // [ 12, 23, 34, 56 ]

Array.prototype.flat() 特性總結(jié)

Array.prototype.flat() 用于將嵌套的數(shù)組“拉平”,變成一維的數(shù)組。該方法返回一個新數(shù)組,對原數(shù)據(jù)沒有影響。

不傳參數(shù)時,默認(rèn)“拉平”一層,可以傳入一個整數(shù),表示想要“拉平”的層數(shù)。

傳入 <=0 的整數(shù)將返回原數(shù)組,不“拉平”

Infinity 關(guān)鍵字作為參數(shù)時,無論多少層嵌套,都會轉(zhuǎn)為一維數(shù)組

如果原數(shù)組有空位,Array.prototype.flat() 會跳過空位。

面試官 N 連問:
第一問:下面數(shù)組如何實現(xiàn)扁平化?

 
 
 
  1. let arr = [
  2.   [1, 2, 2],
  3.   [3, 4, 5, 5],
  4.   [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
  5. ];

小伙伴首先想到的肯定是用 ES6 的Array.prototype.flat方法呀

方法一:flat

 
 
 
  1. arr = arr.flat(2);
  2. // [ 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, [ 12, 13, [ 14 ] ], 10 ]

當(dāng)flat中傳入數(shù)字時,是扁平對應(yīng)的層數(shù),顯然這不是我們想要的,因為它還沒有完全展開。

這是,flat函數(shù)中就為我們提供了一個參數(shù)Infinity,譯為無窮的意思。

 
 
 
  1. arr = arr.flat(Infinity);
  2. /* [
  3.    1,  2,  2, 3,  4,  5,  5,
  4.    6,  7,  8, 9, 11, 12, 12,
  5.   13, 14, 10
  6. ] */

當(dāng)我們不知道數(shù)組中嵌套了幾維數(shù)組時,我們可以用Infinity這個參數(shù),幫我們?nèi)空归_。

第二問:還有其它的辦法嗎?因為它們在高版本瀏覽器并不兼容
方法二:轉(zhuǎn)換為字符串,再把字符串對象用,轉(zhuǎn)換成數(shù)組
可以先把多維數(shù)組先轉(zhuǎn)換為字符串,再基于,分隔符將字符串對象分割成字符串?dāng)?shù)組

toString() 扁平化數(shù)組

 
 
 
  1. arr = arr.toString();
  2. // "1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10"
  3. arr = arr.toString().split(',');
  4. // ["1", "2", "2", "3", "4", "5", "5", "6", "7", "8", "9", "11", "12", "12", "13", "14", "10"]
  5. arr = arr.toString().split(',').map(item => parseFloat(item));
  6. // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

除了上面的方法還有什么方法轉(zhuǎn)換為字符串呢?

JSON.stringify()扁平化數(shù)組

 
 
 
  1. arr = JSON.stringify(arr);
  2. // "[[1,2,2],[3,4,5,5],[6,7,8,9,[11,12,[12,13,[14]]]],10]"
  3. arr = JSON.stringify(arr).replace(/(\[|\])/g, '');
  4. // "1,2,2,3,4,5,5,6,7,8,9,11,12,12,13,14,10"
  5. arr = JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(item=>parseFloat(item));
  6. // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

方法三:循環(huán)驗證是否為數(shù)組
基于數(shù)組的some方法,只要數(shù)組里面有一項元素是數(shù)組就繼續(xù)循環(huán),扁平數(shù)組

核心:[].concat(...arr)

 
 
 
  1. whilte (arr.some(item => Array.isArray(item))) {
  2.  arr = [].concat(...arr);
  3. }
  4. console.log(arr); // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

第三問:能自己實現(xiàn)一個 flat 扁平化嗎?
先回答:能?。≡俑曳治鏊悸?

如何實現(xiàn)呢,其實思路非常簡單:在數(shù)組中找到是數(shù)組類型的元素,然后將他們展開,這就是flat方法的關(guān)鍵思路

實現(xiàn)思路:

循環(huán)數(shù)組里的每一個元素
判斷該元素是否為數(shù)組
是數(shù)組的話,繼續(xù)循環(huán)遍歷這個元素——數(shù)組
不是數(shù)組的話,把元素添加到新的數(shù)組中
實現(xiàn)流程:

創(chuàng)建一個空數(shù)組,用來保存遍歷到的非數(shù)組元素
創(chuàng)建一個循環(huán)遍歷數(shù)組的函數(shù),cycleArray
取得數(shù)組中的每一項,驗證Array.isArray()
數(shù)組的話,繼續(xù)循環(huán)
非數(shù)組的話,添加到新數(shù)組中
返回新數(shù)組對象
ES5 實現(xiàn) flat 扁平化方法

 
 
 
  1. let arr = [
  2.     [1, 2, 2],
  3.     [3, 4, 5, 5],
  4.     [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
  5. ];
  6. function myFlat() {
  7.   _this = this; // 保存 this:arr
  8.   let newArr = [];
  9.   // 循環(huán)arr中的每一項,把不是數(shù)組的元素存儲到 newArr中
  10.   let cycleArray = (arr) => {
  11.     for (let i=0; i< arr.length; i++) {
  12.       let item = arr[i];
  13.       if (Array.isArray(item)) { // 元素是數(shù)組的話,繼續(xù)循環(huán)遍歷該數(shù)組
  14.         cycleArray(item);
  15.         continue;
  16.       } else{
  17.         newArr.push(item); // 不是數(shù)組的話,直接添加到新數(shù)組中
  18.       }
  19.     }
  20.   }
  21.   cycleArray(_this); // 循環(huán)數(shù)組里的每個元素
  22.   return newArr; // 返回新的數(shù)組對象
  23. }
  24. Array.prototype.myFlat = myFlat;
  25. arr = arr.myFlat(); // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

ES6 實現(xiàn) flat 扁平化方法

 
 
 
  1. const myFlat = (arr) => {
  2.   let newArr = [];
  3.   let cycleArray = (arr) => {
  4.     for(let i = 0; i < arr.length; i++) {
  5.       let item = arr[i];
  6.       if (Array.isArray(item)) {
  7.         cycleArray(item);
  8.         continue;
  9.       } else {
  10.         newArr.push(item);
  11.       }
  12.     }
  13.   }
  14.   cycleArray(arr);
  15.   return newArr;
  16. }
  17. myFlat(arr); // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

第四問:請使用reduce實現(xiàn)flat函數(shù)
相信很多面試官都會指定讓面試者用reduce方法實現(xiàn)flat函數(shù)

其實思路也是一樣的,在實現(xiàn)之前,先來看一下

它的核心:[].concat(...arr)

但是它只能將數(shù)組元素展開一層,來看下面例子:

 
 
 
  1. let arr2 = [12, 23, [34, 56, [78, 90, 100]]];
  2. [].concat(...arr2);
  3. // [ 12, 23, 34, 56, [ 78, 90, 100 ] ]

細心的同學(xué)可以發(fā)現(xiàn)[].concat(...arr)只能展開一層數(shù)組元素,當(dāng)有更深層次的,是無法展開的

接下來,我們來看看用reduce怎么實現(xiàn)?

 
 
 
  1. let arr = [12, 23, [34, 56, [78, 90, 100, [110, 120, 130, 140]]]];
  2. const myFlat = arr => {
  3.   return arr.reduce((pre, cur) => {
  4.     return pre.concat(cur);
  5.   }, []);
  6. };
  7. console.log(myFlat(arr));
  8. // [ 12, 23, 34, 56, [ 78, 90, 100, [ 110, 120, 130, 140 ] ] ]
  9. const myFlat = arr => {
  10.   return arr.reduce((pre, cur) => {
  11.     return pre.concat(Array.isArray(cur) ? myFlat(cur) : cur);
  12.   }, []);
  13. };
  14. console.log(myFlat(arr));
  15. // [12, 23, 34, 56, 78, 90, 100, 110, 120, 130, 140]

上面代碼中的Array.isArray(cur)和myFlat(cur)實際就好比與遍歷數(shù)組每一項,看它是不是數(shù)組元素,

如果是的話,則繼續(xù)遞歸遍歷,不是的話直接數(shù)組合并非數(shù)組元素。

第五問:使用棧的思想實現(xiàn)flat函數(shù)
棧思想: 后進先出的數(shù)據(jù)結(jié)構(gòu)

實現(xiàn)思路:

不斷獲取并刪除棧中最后一個元素A,判斷A是否為數(shù)組元素,直到棧內(nèi)元素為空,全部添加到newArr

是數(shù)組,則push到棧中,繼續(xù)循環(huán)棧內(nèi)元素,直到棧為空
不是數(shù)組,則unshift添加到newArr中

 
 
 
  1. // 棧思想
  2. function flat(arr) {
  3.   const newArr = [];
  4.   const stack = [].concat(arr);  // 將數(shù)組元素拷貝至棧,直接賦值會改變原數(shù)組
  5.   //如果棧不為空,則循環(huán)遍歷
  6.   while (stack.length !== 0) {
  7.     const val = stack.pop(); // 刪除數(shù)組最后一個元素,并獲取它
  8.     if (Array.isArray(val)) {
  9.       stack.push(...val); // 如果是數(shù)組再次入棧,并且展開了一層
  10.     } else {
  11.       newArr.unshift(val); // 如果不是數(shù)組就將其取出來放入結(jié)果數(shù)組中
  12.     }
  13.   }
  14.   return newArr;
  15. }
  16. let arr = [12, 23, [34, 56, [78, 90, 100, [110, 120, 130, 140]]]];
  17. console.log(flat(arr));
  18. // [12, 23, 34, 56, 78, 90, 100, 110, 120, 130, 140]

本文總結(jié)
看完這篇文章的同學(xué),可以在面試的時候分類,分思想給面試官描述,可以先說我用哪幾種思想實現(xiàn)過,它們的寫法又分別有什么不同。


網(wǎng)站欄目:精學(xué)手撕系列——數(shù)組扁平化
網(wǎng)頁地址:http://www.5511xx.com/article/cddoiji.html