最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript不使用flat實(shí)現(xiàn)數(shù)組扁平化的三種方法

 更新時(shí)間:2026年03月01日 16:05:14   作者:xixixin_  
本文介紹了幾種不使用array.flat()方法實(shí)現(xiàn)數(shù)組扁平化的具體方式,包括遞歸、迭代和利用reduce簡(jiǎn)化遞歸,這些方法各有特點(diǎn),遞歸易理解適合新手,迭代適合處理超深嵌套數(shù)組,而reduce則使代碼更簡(jiǎn)潔,適用場(chǎng)景廣泛,適合主流瀏覽器,需要的朋友可以參考下

你想在不使用數(shù)組的flat()方法的前提下實(shí)現(xiàn)數(shù)組扁平化,核心是通過遞歸或迭代的方式,逐層遍歷數(shù)組中的元素,把嵌套的子數(shù)組 “拆解” 成一維數(shù)組。我會(huì)給你幾種實(shí)用且易懂的實(shí)現(xiàn)方式,覆蓋不同場(chǎng)景需求。

方法 1:遞歸實(shí)現(xiàn)(最易理解,適合新手)

遞歸的核心思路是:遍歷數(shù)組的每一個(gè)元素,如果元素是數(shù)組,就繼續(xù)遞歸處理這個(gè)子數(shù)組;如果不是數(shù)組,就直接加入結(jié)果數(shù)組。

// 遞歸實(shí)現(xiàn)數(shù)組扁平化(可指定扁平化深度,默認(rèn)完全扁平化)
function flattenArray(arr, depth = Infinity) {
  // 存儲(chǔ)最終扁平化結(jié)果
  const result = [];
  
  // 遍歷原數(shù)組的每一個(gè)元素
  arr.forEach(item => {
    // 判斷:如果當(dāng)前元素是數(shù)組,且還沒達(dá)到指定扁平化深度
    if (Array.isArray(item) && depth > 0) {
      // 遞歸處理子數(shù)組,深度減1
      result.push(...flattenArray(item, depth - 1));
    } else {
      // 非數(shù)組元素直接加入結(jié)果
      result.push(item);
    }
  });
  
  return result;
}

// 測(cè)試用例
const nestedArr = [1, [2, [3, [4, 5]], 6], 7];
// 完全扁平化
console.log(flattenArray(nestedArr)); // [1, 2, 3, 4, 5, 6, 7]
// 只扁平化1層
console.log(flattenArray(nestedArr, 1)); // [1, 2, [3, [4, 5]], 6, 7]

關(guān)鍵解釋

  • Array.isArray(item):判斷元素是否為數(shù)組,這是扁平化的核心判斷條件;
  • depth 參數(shù):控制扁平化深度,和flat(depth)的參數(shù)邏輯一致,默認(rèn)Infinity表示完全扁平化;
  • 擴(kuò)展運(yùn)算符...:把遞歸返回的子數(shù)組元素逐個(gè)推入結(jié)果數(shù)組,避免嵌套。

方法 2:迭代實(shí)現(xiàn)(循環(huán) + 棧,避免遞歸棧溢出)

如果數(shù)組嵌套層級(jí)極深(比如幾十層),遞歸可能會(huì)觸發(fā)棧溢出錯(cuò)誤,這時(shí)用迭代(循環(huán))+ 棧的方式更穩(wěn)健。

// 迭代實(shí)現(xiàn)數(shù)組扁平化(完全扁平化)
function flattenArrayIterative(arr) {
  // 用棧存儲(chǔ)待處理的元素,先把原數(shù)組淺拷貝入棧
  const stack = [...arr];
  const result = [];
  
  // 只要棧不為空,就繼續(xù)處理
  while (stack.length) {
    // 彈出棧頂元素
    const item = stack.pop();
    
    if (Array.isArray(item)) {
      // 如果是數(shù)組,把元素重新推入棧(注意順序:pop是從末尾取,所以要反向推入保持原順序)
      stack.push(...item);
    } else {
      // 非數(shù)組元素加入結(jié)果
      result.push(item);
    }
  }
  
  // 因?yàn)閜op是從后往前取,結(jié)果需要反轉(zhuǎn)恢復(fù)原順序
  return result.reverse();
}

// 測(cè)試用例
const nestedArr = [1, [2, [3, 4], 5]];
console.log(flattenArrayIterative(nestedArr)); // [1, 2, 3, 4, 5]

關(guān)鍵解釋

  • 棧(stack)的特性是 “后進(jìn)先出”,所以最后需要reverse()恢復(fù)原數(shù)組順序;
  • 迭代方式?jīng)]有遞歸的棧深度限制,適合處理超深嵌套的數(shù)組。

方法 3:利用 reduce 簡(jiǎn)化遞歸(簡(jiǎn)潔寫法)

reduce 可以替代手動(dòng)遍歷和結(jié)果數(shù)組的聲明,讓代碼更簡(jiǎn)潔,核心邏輯和遞歸法一致。

// reduce實(shí)現(xiàn)扁平化
function flattenArrayReduce(arr, depth = Infinity) {
  return arr.reduce((acc, item) => {
    if (Array.isArray(item) && depth > 0) {
      // 遞歸處理子數(shù)組,合并到累計(jì)結(jié)果中
      return acc.concat(flattenArrayReduce(item, depth - 1));
    } else {
      // 非數(shù)組元素直接合并
      return acc.concat(item);
    }
  }, []); // 初始值為空數(shù)組
}

// 測(cè)試用例
const nestedArr = [1, [2, [3]], 4];
console.log(flattenArrayReduce(nestedArr)); // [1, 2, 3, 4]

關(guān)鍵解釋

  • reduceacc(累計(jì)值)就是最終的扁平化數(shù)組;
  • concat 方法可以把數(shù)組或單個(gè)元素合并到數(shù)組中,替代push(...)更簡(jiǎn)潔。

總結(jié)

不用flat()實(shí)現(xiàn)數(shù)組扁平化的核心要點(diǎn):

  1. 核心邏輯:遍歷數(shù)組元素,判斷是否為數(shù)組,是則拆解層級(jí),否則直接保留;
  2. 實(shí)現(xiàn)方式
    • 遞歸(forEach/reduce):代碼易讀,適合常規(guī)嵌套深度的數(shù)組;
    • 迭代(棧):無棧溢出風(fēng)險(xiǎn),適合超深嵌套的數(shù)組;
  3. 擴(kuò)展點(diǎn):通過depth參數(shù)可模擬flat(depth)的 “指定深度扁平化” 功能,適配不同需求。

這些方法都能兼容所有主流瀏覽器,且邏輯清晰,新手可以先從遞歸法入手理解,再根據(jù)實(shí)際場(chǎng)景選擇迭代法或 reduce 寫法。

以上就是JavaScript不使用flat實(shí)現(xiàn)數(shù)組扁平化的三種方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript不用flat數(shù)組扁平化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

东兴市| 贵溪市| 达尔| 东乡县| 长岛县| 卢氏县| 瑞金市| 德庆县| 霸州市| 石阡县| 金寨县| 宁河县| 乌兰县| 鹤壁市| 阜城县| 定西市| 金堂县| 铁力市| 新津县| 五家渠市| 贵州省| 绥化市| 汉川市| 五寨县| 灌南县| 枣阳市| 汕尾市| 英吉沙县| 贵南县| 保定市| 广东省| 大渡口区| 昌江| 乌拉特后旗| 阜新市| 许昌县| 莲花县| 新邵县| 上虞市| 新建县| 社会|