电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:98日期: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
相關文章:
主站蜘蛛池模板: 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 微型气泵-真空-蠕动-水泵-厂家-深圳市品亚科技有限公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | 森旺-A级防火板_石英纤维板_不燃抗菌板装饰板_医疗板 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 生鲜配送系统-蔬菜食材配送管理系统-连锁餐饮订货配送软件-挪挪生鲜供应链管理软件 | 影合社-影视人的内容合作平台| 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 热处理温控箱,热处理控制箱厂家-吴江市兴达电热设备厂 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 模型公司_模型制作_沙盘模型报价-中国模型网| 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 精密模具加工制造 - 富东懿|