国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 數(shù)組展開(扁平化)和underscore的 flatten

awokezhou / 1854人閱讀

摘要:原文地址數(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;i
2、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原生方法flat

flat(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)shallowfalse時,stricttrue是,返回的永遠(yuǎn)時[] ,這是因為,當(dāng)shallowfalse時是深度迭代,,當(dāng)最后迭代到不是數(shù)組的時候,就會進(jìn)入到else if中,如果此時stricttrue則就不會進(jìn)入到這個分支中,那么output就永遠(yuǎn)不會被操作,
:::

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104278.html

相關(guān)文章

  • JavaScript專題之數(shù)組平化

    摘要:專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析的源碼扁平化數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組嵌套可以是任何層數(shù)轉(zhuǎn)換為只有一層的數(shù)組。 JavaScript 專題系列第九篇,講解如何實現(xiàn)數(shù)組的扁平化,并解析 underscore 的 _.flatten 源碼 扁平化 數(shù)組的扁平化,就是將一個嵌套多層的數(shù)組 array (嵌套可以是任何層數(shù))轉(zhuǎn)換為只有一層的數(shù)組。 舉個例子,假設(shè)有個...

    tuantuan 評論0 收藏0
  • JavaScript 數(shù)組展開以及 underscore 重要內(nèi)部方法 flatten 詳解

    摘要:今天要講的是數(shù)組展開以及和數(shù)組展開息息相關(guān)的一個重要的內(nèi)部方法。也是個布爾值,當(dāng)為并且也為時,能過濾參數(shù)元素中的非數(shù)組元素。首先并不需要對數(shù)組深度展開,其次傳入的是數(shù)組,對于非數(shù)組元素可以直接忽略。 Why underscore (覺得這一段眼熟的童鞋可以直接跳到正文了...) 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 201...

    binaryTree 評論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...

    Maxiye 評論0 收藏0
  • 1625行,解開 underscore.js 面紗 - 第五章

    摘要:對多個一維數(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...

    Rango 評論0 收藏0
  • JavaScript專題系列20篇正式完結(jié)!

    摘要:寫在前面專題系列是我寫的第二個系列,第一個系列是深入系列。專題系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點贊,鼓勵指正。 寫在前面 JavaScript 專題系列是我寫的第二個系列,第一個系列是 JavaScript 深入系列。 JavaScript 專題系列共計 20 篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖、節(jié)流、去重、類型判斷、拷貝、最值、扁平、柯里...

    sixleaves 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<