一、什么是數組扁平化
扁平化,顧名思義就是減少復雜性裝飾,使其事物本身更簡潔、簡單,突出主題。
數組扁平化,對著上面意思套也知道了,就是將一個復雜的嵌套多層的數組,一層一層的轉化為層級較少或者只有一層的數組。
Ps: flatten 可以使數組扁平化,效果就會如下:
const arr = [1, [2, [3, 4]]]; console.log(flatten(arr)); // [1, 2, 3, 4]
從中可以看出,使用 flatten 處理后的數組只有一層,下面我們來試著實現一下。二、簡單實現 2.1 普通遞歸
這是最容易想到的方法,簡單,清晰!
/* ES6 */ const flatten = (arr) => { let result = []; arr.forEach((item, i, arr) => { if (Array.isArray(item)) { result = result.concat(flatten(item)); } else { result.push(arr[i]) } }) return result; }; const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));
/* ES5 */ function flatten(arr) { var result = []; for (var i = 0, len = arr.length; i < len; i++) { if (Array.isArray(arr[i])) { result = result.concat(flatten(arr[i])) } else { result.push(arr[i]) } } return result; } const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));2.2 toString()
該方法是利用 toString 把數組變成以逗號分隔的字符串,然后遍歷數組把每一項再變回原來的類型。
先來看下 toString 是怎么把數組變成字符串的
[1, [2, 3, [4]]].toString() // "1,2,3,4"
完整的展示
/* ES6 */ const flatten = (arr) => arr.toString().split(",").map((item) => +item); const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));
/* ES5 */ function flatten(arr) { return arr.toString().split(",").map(function(item){ return +item; }); } const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));
這種方法使用的場景卻非常有限,必須數組中元素全部都是 Number。2.3 [].concat.apply + some
也可以全部都為 String,具體實現大家自己體會。
利用 arr.some 判斷當數組中還有數組的話,循環調用 flatten 扁平函數(利用 [].concat.apply扁平), 用 concat 連接,最終返回 arr;
/* ES6 */ const flatten = (arr) => { while (arr.some(item => Array.isArray(item))){ arr = [].concat.apply([], arr); } return arr; } const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));
/* ES5 */ /** * 封裝Array.some * @param {function} callback - 回調函數 * @param {any} currentThis - 回調函數中this指向 */ Array.prototype.some = function (callback, currentThis){ let context = this; let flag = false; currentThis = currentThis || this; for (var i = 0, len = context.length; i < len; i++) { const res = callback.call(currentThis, context[i], i, context); if (res) { flag = true; } else if (!flag) { flag = false; } } return flag; } function flatten(arr){ while(arr.some(item => Array.isArray(item))){ arr = [].concat.apply([], arr); } return arr; } const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));2.4 reduce
reduce 本身就是一個迭代循環器,通常用于累加,所以根據這一特點有以下:
function flatten(arr){ return arr.reduce(function(prev, cur){ return prev.concat(Array.isArray(cur) ? flatten(cur) : cur) }, []) } const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));2.5 ES6 中的 解構運算符 ...
... 每次只能展開最外層的數組,被 [].concat 后,arr 就扁平化一次。
function flatten(arr){ while(arr.some(item => Array.isArray(item))){ arr = [].concat(...arr); } return arr; } const arr = [1, [2, [3, 4]]]; console.log(flatten(arr));
番外篇將給大家講解 lodash 中 flatten 的實現源碼,感謝大家閱讀!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96617.html
距離上次發文,已經有一段時間了,最近工作比較忙,這不眼看快雙十一了,就相當于給大家一些福利吧! showImg(https://segmentfault.com/img/remote/1460000016538082?w=250&h=250); 一、什么是數組去重 簡單說就是把數組中重復的項刪除掉,你 GET 到了嗎 ?下面我將簡單介紹下幾種基本的方法及其優缺點。 二、方法匯總 兩層循環 無相同...
每日肥學 導讀?算法題一點點思路源碼和解析 ?面試題特別介紹 導讀 小伙伴們新的學期又要開始了,您是否已經做好了沖刺的準備了呢?如果您想在這個學期收獲的比別人更多我建議給肥肥點個關注。我們一起來增長知識,無論你是考研還是找工作或者是要加薪。這里都是一個不錯的選擇。讓我們紅塵作伴,一起肥學?。?! ?算法題 實現獲取 下一個排列 的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列...
摘要:如果有兩個參數,該方法返回起始和結束位置之間的項,但不包括結束位置的項。刪除刪除任意數量的項,只需指定兩個參數要刪除的第一項的位置和要刪除的項數。例如會刪除數組中的前兩項。和這兩個方法都接收兩個參數要查找的項和可選的表示查找起點位置的索引。 下面總結了一些JavaScript中常用的數組操作方法。驗證是不是數組用 arr instanceof Array 或者Array.isArray...
閱讀 1076·2021-10-14 09:42
閱讀 1369·2021-09-22 15:11
閱讀 3285·2019-08-30 15:56
閱讀 1243·2019-08-30 15:55
閱讀 3612·2019-08-30 15:55
閱讀 889·2019-08-30 15:44
閱讀 2028·2019-08-29 17:17
閱讀 2072·2019-08-29 15:37