iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS使用reduce()方法处理树形结构数据
  • 441
分享到

JS使用reduce()方法处理树形结构数据

2024-04-02 19:04:59 441人浏览 独家记忆
摘要

目录定义语法实例1. 没有传递初始值init2. 传递初始值的情况下3. 数组去重4. 利用 reduce 对数组中的 Object 对象进行分组及合并5. 利用 reduce 处理

定义

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的资料请关注编程网其它相关文章!

--结束END--

本文标题: JS使用reduce()方法处理树形结构数据

本文链接: https://www.lsjlt.com/news/125675.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS使用reduce()方法处理树形结构数据
    目录定义语法实例1. 没有传递初始值init2. 传递初始值的情况下3. 数组去重4. 利用 reduce 对数组中的 Object 对象进行分组及合并5. 利用 reduce 处理...
    99+
    2024-04-02
  • JavaScript树形数据结构处理
    目录树形数据的一些相关处理方法1. 递归查找当前节点2. 递归获取当前节点及以下的所有节点id3. 递归判断所有后代节点中有无此节点中的一个4. 递归树形数据扁平化5. 扁平化数据转...
    99+
    2024-04-02
  • Java 处理树形结构数据的过程
    目录前言处理过程接下来分析下具体的实现;1、导入的时候以层级保存数据 2、返回树形层级结构数据返回树形层级数据数据导入前言 问题的背景大概是这样的,有下面这样一个excel...
    99+
    2022-11-13
    java 树形结构数据 java 结构数据
  • springboot构造树形结构数据并查询的方法
    因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-pl...
    99+
    2024-04-02
  • JAVA如何把数据库的数据处理成树形结构
    目录前言😎实现思路😎完整代码总结-核心代码前言 不知道大家在做项目的时候有没有接触到将平平无奇数据结合处理成有层次的数据呢,类似下面这样 或者 ...
    99+
    2024-04-02
  • MySQL查询树形结构数据的两种方法
    目录1. 递归查询2. 闭包表对于mysql查询树形结构,可以使用递归查询或者闭包表来实现。以下是两种常用的方法: 1. 递归查询 使用递归查询可以遍历树形结构,获取父节点和子节点的关系。假设有一个名为 your_tab...
    99+
    2023-11-11
    MySQL查询树形数据 MySQL查询树形结构 MySQL树形结构查询
  • JS中的reduce()方法使用小结
    目录一、语法二、实例三、其他相关方法过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它。事实上,如果你能真正了解它的话,其实在很多地方我们都可...
    99+
    2024-04-02
  • springboot构造树形结构数据并查询的方法是什么
    本篇内容主要讲解“springboot构造树形结构数据并查询的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot构造树形结构数据并查询的方法是什么”吧!因为项目需要,页...
    99+
    2023-06-25
  • 数据库树形结构怎么查 四种方法解决
    使SQL实现树形查询 1 树形结构固定,即固定几层结构,可以采用数据库连接查询,这里以两张表为例: select one.id, one.label, two.id, two.labelfrom...
    99+
    2023-09-13
    数据库 sql java
  • Mysql树形结构的数据库表设计方案
    目录前言一、基本数据 二、继承关系驱动的设计 三、基于左右值编码的设计四、树形结构CRUD算法(1)获取某节点的子孙节点 (2)获取某节点的族谱路径(3)为某节点添加子孙节点 (4)...
    99+
    2024-04-02
  • 一文吃透JS树状结构的数据处理(增删改查)
    目录问题描述解决方案1、新增节点2、删除节点3、修改节点4、查找节点总结问题描述 JS处理树状结构的增删改查 最近在开发一个后台管理系统的权限管理模块,涉及到各种树状结构的数据处理逻...
    99+
    2024-04-02
  • Java树形结构数据生成导出excel文件方法记录
    目录什么是树形结构数据 效果用法源码总结什么是树形结构数据 效果 用法 String jsonStr = "{\"name\":\"aaa\",\"children\":[...
    99+
    2024-04-02
  • 使用JavaScript怎么将数组转为树形结构
    本篇文章给大家分享的是有关使用JavaScript怎么将数组转为树形结构,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.需求后台给了一个这样的数据让咱前端去转换为树形结构(没...
    99+
    2023-06-15
  • 树形结构数据库表Schema设计的两种方案
    目录前言一、基本数据二、继承关系驱动的Schema设计三、基于左右值编码的Schema设计四、树形结构CRUD算法(1)获取某节点的子孙节点 (2)获取某节点的族谱路径(3...
    99+
    2024-04-02
  • 在PostgreSQL中使用ltree处理层次结构数据的方法
    目录什么是ltree?为什么选择ltree?初始数据概述在本文中,我们将学习如何使用PostgreSQL的ltree模块,该模块允许以分层的树状结构存储数据。 什么是ltree? L...
    99+
    2024-04-02
  • js中如何使用reduce()方法数组去重
    小编给大家分享一下js中如何使用reduce()方法数组去重,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript的特点1.JavaScript主要用来向HTML页面添加交互行为。2.JavaScript可以直...
    99+
    2023-06-14
  • 利用递归算法怎么将数据库解析成Java树形结构
    利用递归算法怎么将数据库解析成Java树形结构?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、准备表结构及对应的表数据a、表结构:create table T...
    99+
    2023-05-31
    java ava 递归算法
  • MySQL递归查找树形结构(这个方法太实用了!)
    目录1、数据库中的树形结构2、mysql中如何查找相应的数据3、准备工作4.具体的实现(由浅入深)总结这两天,遇到了重要节点的需求。这里简单做个总结。 1、数据库中的树形结构 数据库中存贮的数据,以ID和P_ID(父id...
    99+
    2024-04-02
  • 在QlikView中使用Neo4j处理图形数据的方法
    这篇文章主要介绍在QlikView中使用Neo4j处理图形数据的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  图形数据库是使用带有节点、边缘和属性的图结构来对数据进行存储和展...
    99+
    2024-04-02
  • JavaScript如何处理树状结构数据的增删改查
    这篇文章主要介绍“JavaScript如何处理树状结构数据的增删改查”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript如何处理树状结构数据的增删改查...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作