js中flat方法的實現原理


Array.prototype.flat()

在Array的顯示原型下有一個flat方法,可以將多維數組,降維,傳的參數是多少就降多少維

let arr = [1, [2, 3, [4, 5, [12, 3, "zs"], 7, [8, 9, [10, 11, [1, 2, [3, 4]]]]]]]; console.log(arr.flat(Infinity));//[1, 2, 3, 4, 5, 12, 3, "zs", 7, 8, 9, 10, 11, 1, 2, 3, 4]

 

 

自定義flat的步驟

1、第一步是類型判斷,需要判斷當前調用方法的this是否為一個數組,若不是數組則返回undefined,Array下有一個isArray的方法可以檢測是否為一個數組,下面我提供一種萬能的類型檢測方法

電腦刺綉綉花廠 http://www.szhdn.com 廣州品牌設計公司https://www.houdianzi.com

//萬能的類型檢測方法 const checkType = (arr) => { return Object.prototype.toString.call(arr).slice(8, -1); }

2、第二步需要遍歷數組,並判斷內部的子元素是否也是數組,如果是數組則繼續拆(使用到遞歸和閉包),若不是則直接放入預先創建的新數組  

let arr = [1, [2, 3, [4, 5, [12, 3, "zs"], 7, [8, 9, [10, 11, [1, 2, [3, 4]]]]]]]; //萬能的類型檢測方法 const checkType = (arr) => { return Object.prototype.toString.call(arr).slice(8, -1); } //自定義flat方法,注意:不可以使用箭頭函數,使用后內部的this會指向window Array.prototype.myFlat = function(num) { //判斷第一層數組的類型 let type = checkType(this); //創建一個新數組,用於保存拆分后的數組 let result = []; //若當前對象非數組則返回undefined if (!Object.is(type, "Array")) { return; } //遍歷所有子元素並判斷類型,若為數組則繼續遞歸,若不為數組則直接加入新數組 this.forEach((item) => { let cellType = checkType(item); if (Object.is(cellType, "Array")) { //形參num,表示當前需要拆分多少層數組,傳入Infinity則將多維直接降為一維 num--; if (num < 0) { let newArr = result.push(item); return newArr; } //使用三點運算符解構,遞歸函數返回的數組,並加入新數組 result.push(...item.myFlat(num)); } else { result.push(item); } }) return result; } console.time(); console.log(arr.flat(Infinity)); //[1, 2, 3, 4, 5, 12, 3, "zs", 7, 8, 9, 10, 11, 1, 2, 3, 4]; console.log(arr.myFlat(Infinity)); //[1, 2, 3, 4, 5, 12, 3, "zs", 7, 8, 9, 10, 11, 1, 2, 3, 4]; //自定義方法和自帶的flat返回結果一致!!!! console.timeEnd();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM