摘要:根據需求的特點,數組展開需要進行迭代和遞歸。回答文章開頭的問題將多重數組轉化成單層數組的過程就是數組展開,也叫作數組扁平化一循環(huán)加遞歸最簡單的思路循環(huán)中判斷,如果子元素是數組則遞歸。
前言
首先什么是數組展開?
假如現在有這樣一個需求:將后臺的一個多重 List 數據,展開成一個 List 后,并去重后排序;
["a", "b", ["c", "d"], [["d"],"e"], "f"] => ["a", "b", "c", "d", "e"];
數組去重我們前面在《JS專題之數組去重》已經講過了,那么前一步的多重數組展開成單層數組,該如何處理呢?
這就來到我們所要探討的數組展開了。
根據需求的特點,數組展開需要進行迭代和遞歸。
回答文章開頭的問題:
將多重數組轉化成單層數組的過程就是數組展開,也叫作數組扁平化(flatten)一、循環(huán)加遞歸
最簡單的思路:循環(huán)中判斷,如果子元素是數組則遞歸。
function flatten(origin) { var result = []; for(var i = 0; i< origin.length; i++) { var item = origin[i]; if(Array.isArray(item)) { result = result.concat(flatten(item)) } else { result.push(item); } } return result; } var arr = ["a", "b", ["c", "d"], [["d"],"e"], "f"]; flatten(arr); // ["a", "b", "c", "d", "d", "e", "f"]二、toString()
數組的原型對象上有一個方法,toString, 它能把數組的所以元素轉化成用逗號隔開的字符串。
var arr = [1, [2, 3, [4]], "a", "b", ["c", "d"], [["d"],"e"], "f"]; arr.toString() // "1,2,3,4,a,b,c,d,d,e,f" // 所以,利用 split 先把字符串轉化為單層數組,再進行處理。 const flatten = (origin) => origin.toString().split(","); // ["1", "2", "3", "4", "a", "b", "c", "d", "d", "e", "f"]
由于 toString 轉化為字符串的時候,不會區(qū)分字符串和數字類型,在進行區(qū)分數據類型的時候要注意。
三、split上面的方法,我們用 toString() 將數組轉化為字符串,那么我們也可以用 split 來做:
var arr = [1, [2, 3, [4]], "a", "b", ["c", "d"], [["d"],"e"], "f"]; function flatten(arr) { return arr.join(",").split(","); } console.log(flatten(arr))。 // ["1", "2", "3", "4", "a", "b", "c", "d", "d", "e", "f"]
同樣,這種字符串和數組互轉的過程,不適合多種數據類型同時處理。
四、reduce我們注意到其實數組扁平化其實就是“迭代 + 拼接(累加) + 遞歸”的過程,數組 reduce 方法既可以迭代又可以累加,適合做數組扁平化。
function flatten(origin){ return origin.reduce(function(init, item){ return init.concat(Array.isArray(item) ? flatten(item) : item) }, []) } var arr = [1, [2, 3, [4]], "a", "b", ["c", "d"], [["d"],"e"], "f"]; console.log(flatten(arr)) // [1, 2, 3, 4, "a", "b", "c", "d", "d", "e", "f"]五、some + concat
some 會遍歷數組的每一個元素,判斷是否有元素都滿足條件,最后返回布爾值。some 一旦返回真值后,其后的元素就不會繼續(xù)監(jiān)測。
function flatten(origin) { while (origin.some(item => Array.isArray(item))){ origin = [].concat.apply([], origin); } return origin; } var arr = [1, [2, 3, [4]], "a", "b", ["c", "d"], [["d"],"e"], "f"]; console.log(flatten(arr)) // [1, 2, 3, 4, "a", "b", "c", "d", "d", "e", "f"]六、some + 擴展運算符
ES6 擴展運算符...可以將兩重數組轉換為單層數組:
[].concat(...[1, [2, 3, [4]], "a", "b", ["c", "d"], [["d"],"e"], "f"]); // [1, 2, 3, Array(1), "a", "b", "c", "d", Array(1), "e", "f"] // 利用 some 方法,我們可以實現多重轉換為單層: function flatten(origin) { while(origin.some(item=> Array.isArray(item))) { origin = [].concat(...origin); } return origin; } var arr = [1, [2, 3, [4]], "a", "b", ["c", "d"], [["d"],"e"], "f"]; console.log(flatten(arr)) // [1, 2, 3, 4, "a", "b", "c", "d", "d", "e", "f"]總結
數組扁平化其實就是利用元素迭代 + 元素拼接(疊加)+ 遞歸調用來對數組進行處理,達到將多層數組轉換為單層數組的過程。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101543.html
摘要:專題系列第十八篇,講解遞歸和尾遞歸定義程序調用自身的編程技巧稱為遞歸。然而非尾調用函數,就會創(chuàng)建多個執(zhí)行上下文壓入執(zhí)行上下文棧。所以我們只用把階乘函數改造成一個尾遞歸形式,就可以避免創(chuàng)建那么多的執(zhí)行上下文。 JavaScript 專題系列第十八篇,講解遞歸和尾遞歸 定義 程序調用自身的編程技巧稱為遞歸(recursion)。 階乘 以階乘為例: function factorial(n...
一、什么是數組扁平化 扁平化,顧名思義就是減少復雜性裝飾,使其事物本身更簡潔、簡單,突出主題。 數組扁平化,對著上面意思套也知道了,就是將一個復雜的嵌套多層的數組,一層一層的轉化為層級較少或者只有一層的數組。 Ps: flatten 可以使數組扁平化,效果就會如下: const arr = [1, [2, [3, 4]]]; console.log(flatten(arr)); // [1, ...
摘要:不過的實現中,多了很多細節(jié)上的判斷,比如第一個參數是否是布爾值,是否是一個對象,不傳參數時的默認值等。 JavaScritp 專題系列第七篇,講解如何從零實現一個 jQuery 的 extend 函數 前言 jQuery 的 extend 是 jQuery 中應用非常多的一個函數,今天我們一邊看 jQuery 的 extend 的特性,一邊實現一個 extend! extend 基本用...
閱讀 2546·2023-04-26 00:57
閱讀 917·2021-11-25 09:43
閱讀 2226·2021-11-11 16:55
閱讀 2223·2019-08-30 15:53
閱讀 3599·2019-08-30 15:52
閱讀 1463·2019-08-30 14:10
閱讀 3383·2019-08-30 13:22
閱讀 1216·2019-08-29 11:18