摘要:原文地址數(shù)組展開就是將嵌套的數(shù)組扁平化轉(zhuǎn)換為一維的判斷每一項是否是數(shù)組,然后遞歸遞歸調(diào)用數(shù)組在調(diào)用會將數(shù)組轉(zhuǎn)換成再執(zhí)行方法會變成還需要將所有的參數(shù)轉(zhuǎn)換為數(shù)字,所以這種方式的不足就是如果數(shù)組里面是既有數(shù)字又有字符串,會全部展開為數(shù)字轉(zhuǎn)為數(shù)字方
原文地址
數(shù)組展開就是將嵌套的數(shù)組扁平化(轉(zhuǎn)換為一維的)eg:
const arr=[[[1, 2], [1, 2, 3]], [1, 2]] => [1, 2, 1, 2, 3, 1, 2] console.log(flatten(arr)) //[1,2,1,2,3,1,2]1、判斷每一項是否是數(shù)組,然后遞歸
const arr=[[[1, 2], [1, 2, 3,"a"]], [1, 2,"a"]] function flatten(arr){ let result=[] for(let i=0,l=arr.length;i2、toString 數(shù)組在調(diào)用toString()會將數(shù)組轉(zhuǎn)換成"1,2,1,2,3,1,2",再執(zhí)行split(",")方法會變成["1", "2", "1", "2", "3", "1", "2"]
還需要將所有的參數(shù)轉(zhuǎn)換為數(shù)字,所以這種方式的不足就是如果數(shù)組里面是[1,2,3,"4","5"]既有數(shù)字又有字符串,會全部展開為數(shù)字const arr=[[[1, 2], [1, 2, 3]], [1, 2]] function flatten(arr){ return arr.toString().split(",").map(item => { //轉(zhuǎn)為數(shù)字 return +item }) } console.log(flatten(arr),arr)3、reduce方法const arr=[[[1, 2], [1, 2, 3,"a"]], [1, 2,"b"]] function flatten(arr){ return arr.reduce((pre,next) => { return pre.concat(Array.isArray(next) ? flatten(next) : next) //如果是數(shù)組同樣的遞歸調(diào)用 },[]) } console.log(flatten(arr),arr)4、解構(gòu)的方式利用es6新增結(jié)構(gòu)方法可以提取一層的方法,來一層層提取出來
const arr=[[[1, 2], [1, 2, 3,"a"]], [1, 2,"b"]] function flatten(arr){ while(arr.some(item => Array.isArray(item))){ //如果當(dāng)前數(shù)組中還有數(shù)組,則展開 arr=[].concat(...arr) } return arr } console.log(flatten(arr),arr)5、js原生方法flatflat(depth) 方法會按照一個可指定的深度遞歸遍歷數(shù)組,并將所有元素與遍歷到的子數(shù)組中的元素合并為一個新數(shù)組返回。參數(shù)depth表示要提取嵌套數(shù)組的結(jié)構(gòu)深度,默認(rèn)為1
const arr=[[[1, 2], [1, 2, 3,"a"]], [1, 2,"b"]] arr.flat(Infinity)6、Underscore.js的flatten方法先上代碼
/** * param {Array} input 要操作的數(shù)組 * param {Boolean} shallow 淺展開,及為true時,只展開一層,為false是深度展開 * param {Boolean} strict 遍歷第一層時,是否放棄非數(shù)組對象 * param {Array} output 保存最后輸出的內(nèi)容 */ var flatten = function(input, shallow, strict, output = []) { var idx = output.length; for (var i = 0, length = getLength(input); i < length; i++) { var value = input[i]; // 說明flatten方法對類數(shù)組對象也有支持 if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { if (shallow) { // 只展開一層 var j = 0, len = value.length; while (j < len) output[idx++] = value[j++]; } else { // 深度迭代,遞歸展開 flatten(value, shallow, strict, output); idx = output.length; } } else if (!strict) { output[idx++] = value; } } return output; };output將返回數(shù)組當(dāng)作參數(shù)傳遞,可以省去在遞歸的時候?qū)?shù)據(jù)一層層的return到上一層,在性能上會有所提升
::: tip 注意
當(dāng)shallow為false時,strict為true是,返回的永遠(yuǎn)時[] ,這是因為,當(dāng)shallow為false時是深度迭代,,當(dāng)最后迭代到不是數(shù)組的時候,就會進(jìn)入到else if中,如果此時strict為true則就不會進(jìn)入到這個分支中,那么output就永遠(yuǎn)不會被操作,
:::
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104278.html
摘要:專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析的源碼扁平化數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組嵌套可以是任何層數(shù)轉(zhuǎn)換為只有一層的數(shù)組。 JavaScript 專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析 underscore 的 _.flatten 源碼 扁平化 數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組 array (嵌套可以是任何層數(shù))轉(zhuǎn)換為只有一層的數(shù)組。 舉個例子,假設(shè)有個...
摘要:今天要講的是數(shù)組展開以及和數(shù)組展開息息相關(guān)的一個重要的內(nèi)部方法。也是個布爾值,當(dāng)為并且也為時,能過濾參數(shù)元素中的非數(shù)組元素。首先并不需要對數(shù)組深度展開,其次傳入的是數(shù)組,對于非數(shù)組元素可以直接忽略。 Why underscore (覺得這一段眼熟的童鞋可以直接跳到正文了...) 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 201...
摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...
摘要:對多個一維數(shù)組進(jìn)行并運算,實際上就是加強版的。所以我要說的是這個函數(shù),將傳入?yún)?shù)轉(zhuǎn)換為一個數(shù)組進(jìn)行到的回調(diào)函數(shù)中,以此達(dá)到函數(shù)接到的是一個一維數(shù)組的集合。 每次小章節(jié)的開題都煩惱寫什么好,所以直接接下文 (~o▔▽▔)~o o~(▔▽▔o~) 。 _.first = _.head = _.take = function(array, n, guard) { if (arra...
摘要:寫在前面專題系列是我寫的第二個系列,第一個系列是深入系列。專題系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點贊,鼓勵指正。 寫在前面 JavaScript 專題系列是我寫的第二個系列,第一個系列是 JavaScript 深入系列。 JavaScript 專題系列共計 20 篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖、節(jié)流、去重、類型判斷、拷貝、最值、扁平、柯里...
閱讀 890·2021-10-25 09:44
閱讀 1262·2021-09-23 11:56
閱讀 1183·2021-09-10 10:50
閱讀 3131·2019-08-30 15:53
閱讀 2134·2019-08-30 13:17
閱讀 617·2019-08-29 18:43
閱讀 2491·2019-08-29 12:57
閱讀 855·2019-08-26 12:20