成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

JS使用reduce()方法處理樹形結構數據

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

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

reduce() 與forEach()、map()、filter()這些方法一樣,也會對數組中的每一項進行遍歷,但是reduce() 可以將遍歷的前一個數組項產生的結果與當前遍歷項進行運算。

語法

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

回調函數中的參數:

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

其中常用參數:prev 和 cur

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

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

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

每次調用的參數和返回值如下表:

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被調用三次,開始時prev的值為數組第一項1,cur的值為3,相加之后返回值4作為下一輪回調的prev值,然后繼續下一輪的回調,直至完成后返回。

2. 傳遞初始值的情況下

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

每次調用的參數和返回值如下表:

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. 數組去重

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']

執行的步驟如下:

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

//從后臺獲取的對象數組,根據對象的type進行分組合并成tree樹形展示數據const dataArr = [ { type: ’治理層’, name: ’hive_82’, reserve: ’2’, id: 1 }, { type: ’原始數據層’, 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}, [])​// 合并后的結果: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: ’原始數據層’,children: [ { type: ’原始數據層’, 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 處理菜單后端返回的菜單結構

需要根據 parentId 將這些數據轉換成層級結構。

方法一:

const dataArr = [ {id: ’18’, name: ’重置密碼’, parentId: ’30’,parentName: ’用戶管理’}, {id: ’13’, name: ’審計日志’, parentId: ’29’, parentName: ’系統管理’}, {id: ’29’, name: ’系統管理’, parentId: ’0’, parentName: null}, {id: ’14’, name: ’修改’, parentId: ’33’, parentName: ’部門管理’}, {id: ’2’, name: ’用戶列表’, parentId: ’30’, parentName: ’用戶管理’}, {id: ’30’, name: ’用戶管理’, parentId: ’29’, parentName: ’系統管理’}, {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: ’部門管理’}]//創建菜單id的映射關系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]] ​ // 把當前元素添加到父元素的`children`數組中 parentEl.children = [...(parentEl.children || []), el]})console.log(treeData)

方法二:

//根據parentId創建映射關系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)

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

最后生成的數據結構如下圖所示:

JS使用reduce()方法處理樹形結構數據

以上就是JS使用reduce()方法處理樹形結構數據的詳細內容,更多關于JS的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
99久久综合色| 一区二区免费在线视频| 亚洲精美视频| 国产色爱av资源综合区| 国产一区二区三区精品欧美日韩一区二区三区| 性色一区二区| 一区二区三区中文字幕精品精品| 欧美成人一品| 精品91自产拍在线观看一区| 男女男精品视频| 久久久夜夜夜| 亚洲v中文字幕| 国产精品日韩高清| 一区二区三区在线视频免费观看| 亚洲欧洲一区二区天堂久久| 亚洲欧洲另类国产综合| 欧美1区3d| 久久久久久久久久久黄色| 成人av午夜电影| 精品久久99ma| 国产91精品精华液一区二区三区 | 亚洲日本免费电影| 韩日成人在线| 亚洲欧洲精品一区二区三区不卡| 亚洲视频观看| 亚洲欧美一区二区久久| 国产精品久久久久久模特 | 夜夜爽www精品| ...xxx性欧美| 亚洲经典三级| 一区二区三区四区高清精品免费观看| 狠狠久久婷婷| 综合激情成人伊人| 国产午夜久久| 偷窥少妇高潮呻吟av久久免费| 美女久久一区| 奇米精品一区二区三区四区| 91九色最新地址| 国内一区二区在线| 日韩限制级电影在线观看| 国产成人在线看| 欧美mv日韩mv| 你懂的亚洲视频| 亚洲视频一区二区在线观看| 一本久道久久综合婷婷鲸鱼| 亚洲成人福利片| 91福利视频久久久久| 捆绑紧缚一区二区三区视频| 91麻豆精品国产无毒不卡在线观看| 久久99精品国产.久久久久久| 3751色影院一区二区三区| 成人免费黄色在线| 久久久久久久久久久久电影 | 欧美99在线视频观看| 国产精品久久久久久亚洲毛片 | 性欧美暴力猛交另类hd| 日韩电影一二三区| 欧美久久婷婷综合色| av激情成人网| 亚洲色图在线播放| 色欲综合视频天天天| 国产精品一色哟哟哟| 久久久影院官网| 激情亚洲网站| 偷拍日韩校园综合在线| 8v天堂国产在线一区二区| 99re热视频这里只精品| 亚洲视频小说图片| 色婷婷精品久久二区二区蜜臀av| 国产主播一区二区| 国产日韩三级在线| 一区二区高清视频| 经典一区二区三区| 久久毛片高清国产| 夜夜嗨网站十八久久 | 国产一区久久| 亚洲综合在线电影| 欧美日韩亚州综合| 91同城在线观看| 亚洲夂夂婷婷色拍ww47| 欧美人与z0zoxxxx视频| 91婷婷韩国欧美一区二区| 亚洲免费观看高清完整版在线| 色妞www精品视频| 成人动漫一区二区三区| 亚洲精品中文字幕在线观看| 欧美唯美清纯偷拍| 92精品国产成人观看免费| 亚洲综合999| 欧美电影免费观看高清完整版在线| 国内精品福利| 日本中文字幕一区二区视频| 精品国产免费一区二区三区四区| 伊人成人在线视频| 久久精品国产久精国产| 国产精品五月天| 91福利精品第一导航| 99国产精品99久久久久久| 亚洲综合自拍偷拍| 精品美女在线播放| 国产精品久久久亚洲一区| 国产精品夜夜爽| 自拍偷拍亚洲激情| 欧美日韩三级在线| 欧美精品一线| 蜜桃视频免费观看一区| 国产午夜一区二区三区| 91成人网在线| 国产精品hd| 激情欧美一区二区| 中文字幕一区在线观看视频| 欧美少妇性性性| 在线成人亚洲| 国产激情偷乱视频一区二区三区| 国产农村妇女毛片精品久久麻豆 | 久久久蜜臀国产一区二区| 狂野欧美一区| 不卡一区二区在线| 亚洲 欧美综合在线网络| 精品国产三级电影在线观看| 日本久久一区二区| 亚洲大黄网站| 不卡的av电影在线观看| 日本视频一区二区三区| 国产精品色婷婷久久58| 制服丝袜一区二区三区| 国产一区二区你懂的| 成人a免费在线看| 美国av一区二区| 一区二区三区免费| 精品国产乱码久久久久久夜甘婷婷| 色综合久久久久久久| 欧美大片一区| 国产揄拍国内精品对白| 一区二区在线免费观看| 国产婷婷色一区二区三区在线| 欧美精品丝袜久久久中文字幕| 一本色道久久综合亚洲精品婷婷| 成人爱爱电影网址| 蜜桃av噜噜一区二区三区小说| 亚洲欧洲制服丝袜| 26uuu久久天堂性欧美| 豆国产96在线|亚洲| 日本视频中文字幕一区二区三区| 亚洲黄网站在线观看| 精品国产乱码久久久久久1区2区| 欧日韩精品视频| 亚洲在线黄色| 欧美三级第一页| 成人毛片在线观看| 精久久久久久久久久久| 五月激情六月综合| 亚洲码国产岛国毛片在线| 久久久久国产精品免费免费搜索| 欧美美女一区二区三区| 日本道色综合久久| 欧美亚洲一级| 亚洲另类黄色| 欧美日韩精品伦理作品在线免费观看| 高清在线不卡av| 九九精品视频在线看| 日韩精品亚洲专区| 亚洲精品国产视频| 国产精品不卡一区二区三区| 国产日韩av一区| 精品久久久久99| 欧美一二三区在线观看| 欧美精品视频www在线观看 | 国产欧美日韩在线| 久久九九久精品国产免费直播| 2023国产精品自拍| 欧美成人免费网站| 91精品久久久久久蜜臀| 欧美伊人久久久久久久久影院 | 国产一区二区你懂的| 99精品视频免费全部在线| 在线观看一区| 海角社区69精品视频| 欧美大香线蕉线伊人久久国产精品| jlzzjlzz亚洲日本少妇| 丁香婷婷综合网| 粉嫩欧美一区二区三区高清影视| 激情综合网天天干| 国产最新精品精品你懂的| 免费观看在线色综合| 久久福利资源站| 精品一区在线看| 国产一级精品在线| 成人午夜av电影| 成人一区二区三区视频在线观看| 国产风韵犹存在线视精品| 国产一区二区精品在线观看| 国产成人精品亚洲777人妖| 不卡大黄网站免费看| 欧美1级日本1级| 红桃视频欧美| 日韩天天综合| 性久久久久久| 欧美亚洲综合一区| 欧美亚洲动漫精品|