日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

JS使用reduce()方法處理樹形結(jié)構(gòu)數(shù)據(jù)

瀏覽:165日期:2024-03-26 13:24:30
定義

reduce() 方法對數(shù)組中的每個元素執(zhí)行一個由您提供的reducer函數(shù)(升序執(zhí)行),將其結(jié)果匯總為單個返回值。

reduce() 與forEach()、map()、filter()這些方法一樣,也會對數(shù)組中的每一項進(jìn)行遍歷,但是reduce() 可以將遍歷的前一個數(shù)組項產(chǎn)生的結(jié)果與當(dāng)前遍歷項進(jìn)行運算。

語法

array.reduce(function(prev, cur, index, array){ ...}, init);

回調(diào)函數(shù)中的參數(shù):

prev 必需。表示調(diào)用回調(diào)時的返回值,或者初始值 init。 cur 必需。表示當(dāng)前元素。 index 可選。表示當(dāng)前元素的索引。 array 表示原數(shù)組。 init 可選。初始值,作為第一次調(diào)用回調(diào)函數(shù)的第一個參數(shù)。

其中常用參數(shù):prev 和 cur

注意:回調(diào)函數(shù)第一次執(zhí)行時,prev和cur的取值有兩種情況:如果調(diào)用reduce()時提供了初始值init,prev取init值,cur取數(shù)組中的第一個值,此時索引從0開始;如果沒有提供初始值init,則prev取數(shù)組中的第一個值,cur取數(shù)組中的第二個值,此時索引從1開始。

實例1. 沒有傳遞初始值init

const arr = [1, 3, 5, 7]arr.reduce(function(prev, cur, index, arr){ console.log(prev, cur, index) return prev + cur})

每次調(diào)用的參數(shù)和返回值如下表:

callback prev cur index array return value 第1次 1 3 1 [1, 3, 5, 7] 4 第2次 4 5 2 [1, 3, 5, 7] 9 第3次 9 7 3 [1, 3, 5, 7] 16

因為沒有傳入初始值,所以索引是從1開始,callback被調(diào)用三次,開始時prev的值為數(shù)組第一項1,cur的值為3,相加之后返回值4作為下一輪回調(diào)的prev值,然后繼續(xù)下一輪的回調(diào),直至完成后返回。

2. 傳遞初始值的情況下

const arr = [1, 3, 5, 7]arr.reduce(function(prev, cur, index, arr){ console.log(prev, cur, index) return prev + cur}, 10)

每次調(diào)用的參數(shù)和返回值如下表:

callback prev cur index array return value 第1次 10 1 0 [1, 3, 5, 7] 11 第2次 11 3 1 [1, 3, 5, 7] 14 第3次 14 5 2 [1, 3, 5, 7] 19 第4次 19 7 3 [1, 3, 5, 7] 26 3. 數(shù)組去重

const arr = [’ab’, ’v’, ’d’, ’ab’, ’h’, ’e’, ’dc’, ’e’, ’e’, ’f’]const newArr = arr.reduce(function(prev, cur){ !prev.includes(cur) && prev.push(cur) return prev}, [])console.log(newArr) // ['ab', 'v', 'd', 'h', 'e', 'dc', 'f']

執(zhí)行的步驟如下:

初始化一個空數(shù)組 第一次調(diào)用時,prev 為初始值即空數(shù)組,cur 為數(shù)組中的第一項 arr[1],然后在 prev 中查找 cur 是否已經(jīng)存在,如果不存在就將該項添加到 prev 中,并 prev 返回進(jìn)入下一次回調(diào) 第二次回調(diào)時,prev 為第一次的返回值,cur 為數(shù)組中的第二項 arr[2],然后在 prev 中查找 cur 是否已經(jīng)存在,如果不存在就將該項添加到 prev 中,并 prev 返回進(jìn)入下一次回調(diào) 最后將 prev 這個數(shù)組返回4. 利用 reduce 對數(shù)組中的 Object 對象進(jìn)行分組及合并

//從后臺獲取的對象數(shù)組,根據(jù)對象的type進(jìn)行分組合并成tree樹形展示數(shù)據(jù)const dataArr = [ { type: ’治理層’, name: ’hive_82’, reserve: ’2’, id: 1 }, { type: ’原始數(shù)據(jù)層’, name: ’qwe’, reserve: ’1’, id: 2 }, { type: ’貼源層’, name: ’mysql_exchangis’, reserve: ’3’, id: 3 }, { type: ’治理層’, name: ’links_188’, reserve: ’1’, id: 4 }, { type: ’貼源層’, name: ’mysql_ces’, reserve: ’2’, id: 5 }]const treeData = dataArr.reduce((cur, next) => { const obj = cur.find(curItem => curItem.label === next.type) if (obj) {if (obj.children.indexOf(next.id) === -1) { //去重處理 obj.children.push({ ...next, label: next.name })} } else {const newObj = { label: next.type, children: [{...next,label: next.name }]}cur.push(newObj) } return cur}, [])​// 合并后的結(jié)果:treeData = [ {label: ’治理層’,children: [ { type: ’治理層’, name: ’hive_82’, reserve: ’2’, id: 1, label: ’hive_82’ }, { type: ’治理層’, name: ’links_188’, reserve: ’1’, id: 4, label: ’links_188’ }] }, {label: ’原始數(shù)據(jù)層’,children: [ { type: ’原始數(shù)據(jù)層’, name: ’qwe’, reserve: ’1’, id: 2, label: ’qwe’ }] }, {label: ’貼源層’,children: [ { type: ’貼源層’, name: ’mysql_exchangis’, reserve: ’3’, id: 3, label: ’mysql_exchangis’ }, { type: ’治理層’, name: ’mysql_ces’, reserve: ’2’, id: 5, label: ’mysql_ces’ }] }]5. 利用 reduce 處理菜單后端返回的菜單結(jié)構(gòu)

需要根據(jù) parentId 將這些數(shù)據(jù)轉(zhuǎn)換成層級結(jié)構(gòu)。

方法一:

const dataArr = [ {id: ’18’, name: ’重置密碼’, parentId: ’30’,parentName: ’用戶管理’}, {id: ’13’, name: ’審計日志’, parentId: ’29’, parentName: ’系統(tǒng)管理’}, {id: ’29’, name: ’系統(tǒng)管理’, parentId: ’0’, parentName: null}, {id: ’14’, name: ’修改’, parentId: ’33’, parentName: ’部門管理’}, {id: ’2’, name: ’用戶列表’, parentId: ’30’, parentName: ’用戶管理’}, {id: ’30’, name: ’用戶管理’, parentId: ’29’, parentName: ’系統(tǒng)管理’}, {id: ’33’, name: ’部門管理’, parentId: ’0’, parentName: null}, {id: ’37’, name: ’添加用戶’, parentId: ’30’, parentName: ’用戶管理’}, {id: ’6’, name: ’添加’, parentId: ’33’, parentName: ’部門管理’}, {id: ’7’,name: ’刪除’, parentId: ’33’, parentName: ’部門管理’}]//創(chuàng)建菜單id的映射關(guān)系const idMapping = dataArr.reduce((prev, next, i) => { prev[next.id] = i return prev}, {})​const treeData = []dataArr.map(el => { // 一級菜單 if (el.parentId === ’0’) {treeData.push(el)return }// 通過映射找到父元素 const parentEl = dataArr[idMapping[el.parentId]] ​ // 把當(dāng)前元素添加到父元素的`children`數(shù)組中 parentEl.children = [...(parentEl.children || []), el]})console.log(treeData)

方法二:

//根據(jù)parentId創(chuàng)建映射關(guān)系const result = dataArr.reduce((prev, next) => { prev[next.parentId] ? prev[next.parentId].push(next) : prev[next.parentId] = [next]; return prev;}, {}); Object.keys(result).map(key => { result[key].map((item, i) => {result[item.id] ? item.children = result[item.id] : ’’ });}) this.treeData = result[0]console.log(treeData)

還可以通過遞歸的方法來實現(xiàn),具體就不贅述了

最后生成的數(shù)據(jù)結(jié)構(gòu)如下圖所示:

JS使用reduce()方法處理樹形結(jié)構(gòu)數(shù)據(jù)

以上就是JS使用reduce()方法處理樹形結(jié)構(gòu)數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于JS的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品视区| 青青青免费在线视频| 麻豆国产91在线播放| 日韩精品第一| 国产精品二区影院| 国产一区二区三区不卡视频网站| 日本成人中文字幕在线视频| 一区二区三区四区精品视频| 日韩一区精品| 国产精品美女午夜爽爽| 国产一区二区精品久| 亚洲va中文在线播放免费| 亚洲午夜av| 日韩一区精品| 精品午夜久久| 91成人精品| 午夜久久av| 精品99在线| 自拍日韩欧美| 国产人成精品一区二区三| 水蜜桃精品av一区二区| 美女毛片一区二区三区四区| 亚洲有吗中文字幕| 色综合五月天| 日产欧产美韩系列久久99| 黑森林国产精品av| 久久亚洲色图| 国产精品成人a在线观看| 午夜欧美在线| 鲁大师精品99久久久| 亚洲一区二区三区高清不卡| 国产精品久久久久久妇女| 狠狠爱成人网| 国产一区二区亚洲| 人人爱人人干婷婷丁香亚洲| 欧美精选一区二区三区| 国产毛片精品| 日韩精品一二三四| 99成人在线视频| 嫩呦国产一区二区三区av| 免费成人性网站| 久久蜜桃精品| 精品国产精品久久一区免费式| 视频一区日韩精品| 蜜臀av亚洲一区中文字幕| 久久精品国产大片免费观看| 国产麻豆一区| 91精品国产自产观看在线| 三级一区在线视频先锋| 青草av.久久免费一区| 五月天久久久| 国产一区国产二区国产三区| 欧美亚洲网站| 国产免费久久| 久久国产乱子精品免费女| 欧美日韩国产精品一区二区亚洲| 麻豆mv在线观看| 精品国产精品久久一区免费式| 国产精品一区二区三区av| 日韩成人一级| 日韩影片在线观看| 亚洲日本欧美| 日韩欧美中文字幕电影| 综合一区av| 欧美一区成人| 国产精品免费精品自在线观看| 四虎国产精品免费久久| 色8久久久久| 国产色噜噜噜91在线精品| 国产欧美一区二区三区国产幕精品| 日韩国产91| 国产精品视频一区二区三区四蜜臂| 奇米亚洲欧美| 国精品产品一区| 99久久亚洲精品蜜臀| 最新国产拍偷乱拍精品| 日韩精品一级中文字幕精品视频免费观看| 国产精品呻吟| 国产乱码精品一区二区三区四区 | 99热免费精品| 亚洲午夜久久| 国产精品久久久久久久免费软件| 久久精品资源| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品xxxav免费视频| 日产午夜精品一线二线三线| 999精品色在线播放| 视频一区二区三区在线| 国产乱码精品一区二区亚洲| 日韩成人三级| 日韩中文字幕无砖| 久久精品国产一区二区| 视频二区不卡| 国产图片一区| 999在线观看精品免费不卡网站| 日本91福利区| 999久久久免费精品国产| 欧美午夜网站| 亚洲一区二区三区高清不卡| 国产成人免费精品| 日韩**一区毛片| 91精品国产福利在线观看麻豆| 97成人超碰| 免费精品视频最新在线| 麻豆国产在线| 国产亚洲精aa在线看| 国产字幕视频一区二区| 国产女人18毛片水真多18精品| 伊人久久婷婷| 久久精品国语| 日韩成人a**站| 国产剧情在线观看一区| 亚洲毛片一区| 欧美日韩国产一区二区三区不卡| 精品三级在线| 六月丁香综合在线视频| 欧美精品影院| 91麻豆精品| 日本成人在线视频网站| 亚洲影视一区二区三区| 国产精品婷婷| 99亚洲视频| 久久三级视频| 欧美freesex黑人又粗又大| 另类激情亚洲| 欧美另类专区| 黄色国产精品| 亚洲经典在线| 日韩精品一二三区| 涩涩涩久久久成人精品| 在线一区欧美| 久久亚洲影院| 亚洲精品麻豆| 国产麻豆精品久久| 精品亚洲成人| 久久精品青草| 日韩午夜av| 999在线观看精品免费不卡网站| 五月天久久久| 亚洲精品婷婷| 久久av日韩| 久久天堂av| 久久亚洲电影| 免费一级欧美片在线观看网站| 国产精品2023| 99精品小视频| 蜜桃av一区二区三区电影| 日本不卡一区二区三区| 成人污污视频| 亚洲一区日韩在线| 老司机免费视频一区二区三区| 久久激情婷婷| 亚洲乱码视频| av综合电影网站| 日韩中文字幕亚洲一区二区va在线| 人人精品久久| 久久久国产亚洲精品| 在线免费观看亚洲| 激情久久一区二区| 婷婷亚洲综合| 国产精品超碰| 巨乳诱惑日韩免费av| 不卡专区在线| 婷婷综合电影| 1024精品久久久久久久久| 麻豆久久一区二区| 欧美日韩一二三四| 日韩欧美国产精品综合嫩v| 亚洲精品三级| 国产视频一区三区| 日韩精品第一区| 91精品国产经典在线观看| 九九久久婷婷| av在线日韩| 精品一区二区三区的国产在线观看| 亚洲国产一区二区三区在线播放| 国产视频一区二| 亚洲精品乱码久久久久久蜜桃麻豆| 91精品国产乱码久久久久久久 | 丝袜国产日韩另类美女| 成人高清一区| 日韩成人精品一区二区三区| av不卡在线| 亚洲精品一二三区区别| 日韩激情一区| 国产suv精品一区二区四区视频| 啪啪亚洲精品| 日韩精品一区二区三区中文在线| 国产综合视频| 欧美性感美女一区二区| 韩国精品主播一区二区在线观看| 免费在线日韩av| 精品一区91| 理论片午夜视频在线观看| 麻豆91在线播放| 国产专区精品| 久久精品国产99国产精品| 精品国产欧美日韩| 成人三级高清视频在线看| 国产自产自拍视频在线观看|