91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

js數(shù)組扁平化:從‘千層餅’到‘一馬平川’的六種神操作 ??→??

freeflydom
2025年6月5日 11:3 本文熱度 139

一、生活場景:什么叫"數(shù)組不扁平"?

想象你收拾衣柜:

  • 千層餅數(shù)組[襪子, [褲子, [上衣, 腰帶]], 鞋子](找雙襪子要翻三層)
  • 扁平數(shù)組[襪子, 褲子,上衣,腰帶,鞋子](一目了然)

需求:把嵌套數(shù)組變成一維數(shù)組,就是扁平化!


二、青銅選手:flat()方法(ES10真香)

const messyCloset = ['襪子', ['褲子', ['上衣', '腰帶']], '鞋子'];
// 1. 默認只拍平一層
const level1 = messyCloset.flat(); 
// ['襪子', '褲子', ['上衣', '腰帶'], '鞋子']
// 2. 傳入Infinity直接全平
const allFlat = messyCloset.flat(Infinity);
// ['襪子', '褲子', '上衣', '腰帶', '鞋子']

我的翻車史
曾經(jīng)以為flat(2)flat(Infinity)效果一樣,直到遇到五層嵌套數(shù)組...


三、白銀選手:reduce+遞歸(經(jīng)典永流傳)

function flatten(arr) {
  return arr.reduce((result, item) => {
    return result.concat(
      Array.isArray(item) ? flatten(item) : item
    );
  }, []);
}
const myCloset = ['??', ['??', ['??']], '??'];
console.log(flatten(myCloset)); // ['??', '??', '??', '??']

適用場景

  • 需要兼容老瀏覽器時
  • 面試官盯著你手寫實現(xiàn)時 ??

四、黃金選手:toString妙用(數(shù)字數(shù)組專屬)

const numLayers = [1, [2, [3, [4]]]];
// 1. 轉(zhuǎn)字符串再分割
const strFlat = numLayers.toString().split(','); 
// ['1', '2', '3', '4']
// 2. 轉(zhuǎn)數(shù)字(需處理非數(shù)字項)
const numFlat = strFlat.map(Number); 
// [1, 2, 3, 4]

致命缺陷

  • 會把[1, 'a']變成['1', 'a']
  • 遇到null, undefined直接轉(zhuǎn)字符串

五、鉑金選手:生成器函數(shù)(優(yōu)雅處理海量數(shù)據(jù))

function* flattenGen(arr) {
  for (const item of arr) {
    Array.isArray(item) ? yield* flattenGen(item) : yield item;
  }
}
const hugeArray = [1, [2, [3, [4, ...[1000000個項]]]];
const flattened = [...flattenGen(hugeArray)]; // 按需生成不爆內(nèi)存

性能優(yōu)勢
處理超大規(guī)模數(shù)組時,不會一次性占用大量內(nèi)存


六、鉆石選手:棧結(jié)構(gòu)迭代(避免遞歸爆棧)

function flattenStack(arr) {
  const stack = [...arr];
  const result = [];
  
  while (stack.length) {
    const next = stack.pop();
    Array.isArray(next) ? stack.push(...next) : result.push(next);
  }
  
  return result.reverse();
}
const deepArray = [1, [2, [3, [4]]];
console.log(flattenStack(deepArray)); // [1, 2, 3, 4]

適用場景

  • 嵌套層級極深時(遞歸可能棧溢出)
  • 需要控制遍歷順序時

七、王者選手:Array.prototype.flatMap (ES2019)

// 先map再flat(1)的語法糖
const data = [1, [2], 3];
const processed = data.flatMap(item => 
  Array.isArray(item) ? item : [item * 2]
);
// [2, 2, 6] 

神技巧
flatMap實現(xiàn)過濾+展開二合一:

const mixed = [1, 2, , , 5];
const compact = mixed.flatMap(x => x || []);
// [1, 2, 5] (自動跳過空值)

八、終極選擇指南

場景推薦方案原因
現(xiàn)代瀏覽器環(huán)境flat(Infinity)原生API性能最佳
需要兼容IEreduce+遞歸兼容性好
純數(shù)字數(shù)組toString+split取巧但高效
超大數(shù)據(jù)量生成器函數(shù)內(nèi)存友好
需要控制遍歷順序棧結(jié)構(gòu)迭代避免遞歸爆棧
需要邊處理邊展開flatMap代碼最簡潔

九、真實案例:樹形菜單扁平化

// 原始樹形數(shù)據(jù)
const menuTree = [
  {
    name: '文件',
    children: [
      { name: '新建' },
      { name: '打開', children: [{ name: '從云端' }] }
    ]
  }
];
// 遞歸提取所有節(jié)點名
function getAllNames(items) {
  return items.flatMap(item => [
    item.name,
    ...(item.children ? getAllNames(item.children) : [])
  ]);
}
console.log(getAllNames(menuTree)); 
// ['文件', '新建', '打開', '從云端']


轉(zhuǎn)自https://juejin.cn/post/7511969803557584937


該文章在 2025/6/5 11:03:14 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 午夜家庭影院 | 精品动漫一区二区 | 国产精品专区色 | 国产狂喷潮在线 | 欧美综合视频 | 国产福利在线观 | 国产免费大黄 | 中文字幕在线视频 | 国产亚洲精品成 | 黑人巨茎精品 | 69视频成| 日韩精品三 | 午夜天堂| 青草青草久 | 国产精品视频42页 | 日本一区不 | 日本在线播放观看 | 国产理论 | 国产午夜福利电影h | 欧美最猛黑人xx | 91福利午夜| 黑人狂躁日 | 蜜桃色永久入口 | 日韩1页 | 最新中文字幕av专区不卡 | 国语对白精品视 | 日本欧美综合观看 | 日本精品视频一区 | 老司国产 | 精品视频 | 国产丝袜在线视频 | 国产日韩欧美中文 | 日韩在线1区精品 | 国产玉足榨精视频 | 91视频免费福利 | 国产日韩一区美利坚 | 日本不卡a| 国产日韩欧美一区精 | 精品国产91久 | 成人观看在线一区 | 国产精品12区 |