`
leeqq
  • 浏览: 138599 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

将有层级标志的数组转为树状结构

    博客分类:
  • web
 
阅读更多

最近项目中遇到了将数组形式的菜单转化为树状结构的菜单

例如,原始数据是

 

[
    {id: 1,  parentId: 0, name: '第一级菜单A' },
    {id: 2,  parentId: 0, name: '第一级菜单B' },
    {id: 3,  parentId: 1, name: '第二级菜单A' },
    {id: 4,  parentId: 1, name: '第二级菜单B' },
    {id: 5,  parentId: 3, name: '第三级菜单A' },
    {id: 6,  parentId: 3, name: '第三级菜单B' },
    {id: 7,  parentId: 4, name: '第三级菜单C' },
    {id: 8,  parentId: 4, name: '第三级菜单D' },
    {id: 9,  parentId: 2, name: '第二级菜单C' },
    {id: 10, parentId: 2, name: '第二级菜单D' }
]

 转化为

 

  

 

 

需求已经明确,现在就看是怎么实现的

 

两次对数组两次循环

第一次循环

    找到所有第一级菜单放入数组A,其余的放入另一个数组B,并将所有菜单以id作为key放入一个对象C中,

第二次循环

    对数组B循环,通过parentId到对象C中找到父级,并push到父级的children数组中。

通过这两次循环,已经转化完成,代码如下

 

function array2tree (arr) {
    var top = [], sub = [], arrObj = {};

    arr.forEach(function (item) {
        if (item.parentId === 0) {
            top.push(item);
        } else {
            sub.push(item);
        }
        item.children = [];
        arrObj[item.id] = item;
    });

    sub.forEach(function (item) {
        var parent = arrObj[item.parentId] || {'children': []};
        parent.children.push(item);
    });

    return top;
}

 

 

那么问题来了,能否通过一次循环就解决问题,答案是可以的

在循环过过程中将第一级菜单放入数组A,将所有菜单以id作为key放入对象B中,同时以parentId作为key在对象B中找到其父级,并将其push到父级的children中,在这一步需要注意的是,如果子级先出现,那么就有可能在对象B中找不到父级。所以这里要作点处理,具体如下

如果子级先出现,在对象B中找不到父级,这是要在对象B中创建一个对象作为临时的父级,并将子级push到这个临时的父级children中。当然这个子菜单也要放入对象B中

这是又会出现另外一个问题,当真正的父级出现时,对象B中已经存在一个临时的父级时,这时要作的处理是将临时的父级的属性扩展到真正的父级中,并用真正的父级替换对象B中的临时父级。

 

哈哈,真绕,看代码

function array2tree (arr) {
    var top = [], arrObj = {};

    arr.forEach(function (item) {
        var id = item.id, parentId = item.parentId, parent, own;
        if (parentId === 0) {
            top.push(item);
        }

        item.children = [];
        own = arrObj[id];
        if (own) {
            Object.keys(own).forEach(function (key) {
                item[key] = own[key];
            });
        }
        arrObj[id] = item;

        parent = arrObj[parentId];
        if (!parent) {
            parent = {'id': parentId, 'children': []};
            arrObj[parentId] = parent;
        }
        parent.children.push(item);

    });
    return top;
}

 

  • 大小: 4.1 KB
  • 大小: 30.3 KB
分享到:
评论

相关推荐

    JavaScript将数组转化为多级树状结构.zip

    这个“JavaScript将数组转化为多级树状结构”的主题涉及到了数据结构的转换技巧,是前端开发中的重要技能之一。 首先,我们需要理解什么是树状结构。在计算机科学中,树是一种非线性的数据结构,它由节点(也称为...

    php遍历目录生成树状结构

    一个类,可以遍历一个目录,将该目录下所有文件以及子目录及其文件都遍历,生成一个层次分明的数组,还可以将遍历的结果生成一个树状的字符串,直接echo到浏览器。 |-|a.txt |-|b.txt |-|c目录 |---|d.txt |---|c1...

    php数组生成树

    这将生成一个表示树结构的嵌套数组,每个节点都有可能包含任意数量的子节点。 总结一下,PHP数组生成树的核心在于理解如何利用递归函数和关联数组来构建层次结构。通过将扁平化的一维数组转换为多维树结构,我们...

    基于php非递归实现的高性能的处理数组的层级关系、包括生成无限极分类、树状结构

    【作品名称】:基于php非递归实现的高性能的处理数组的层级关系、包括生成无限极分类、树状结构 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期...

    java将list转为树形结构的方法(后台和前台)

    标题中的“java将list转为树形结构的方法(后台和前台)”指的是在Java编程语言中,如何将一个列表(List)数据结构转换为树形结构。这种转换通常用于处理层级关系的数据,如目录结构、组织架构等。转换分为前端...

    树状结构下拉选

    1. **数据结构**:首先,树状结构基于节点的概念,每个节点可以有子节点,形成层级关系。这通常以JSON或其他数据格式存储,例如: ```json { "text": "父节点", "children": [ { "text": "子节点1", ...

    js代码-数组根据pid转为树形结构的数组

    本案例中的"js代码-数组根据pid转为树形结构的数组"涉及到的就是将一个基于父级ID(PID)的扁平化数组转换为树形结构的数组。这种转换在构建组织结构、文件系统或者菜单导航等场景中非常常见。 首先,我们来理解...

    Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)

    数据结构为数组中包含对象–树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据。本文为用Vue实现方式,另有一篇为用knockout.js的实现方法。 ...

    Java树状结构实现BBS

    首先,**树状结构**是数据结构的一种,它通过节点之间的层级关系来表示数据。在BBS系统中,每个帖子可视为一个节点,每个回复则作为其子节点,这样用户可以清晰地看到谁回复了谁,形成一个有序的讨论链。这种结构...

    用Ajax实现jsp页面树状结构

    在本场景中,我们将在JSP页面中通过Ajax实现树状结构的动态加载,提高用户体验。 首先,我们需要理解Ajax(Asynchronous JavaScript and XML)的核心概念。Ajax并非一种新技术,而是利用已有技术组合的一种新方法。...

    利用递归把多维数组转为一维数组的函数

    函数名称:array_multi2single 函数原形:array array_multi2single(array) 实现功能:把一个多维数组的数值存放到一维数组中,不保存Key。 <?php function array_multi2single($array) { static $result_array=...

    js代码-数组转化树形结构

    在JavaScript开发中,数据结构的转换是常见的任务之一,尤其是将扁平化的数组转化为树形结构,这在处理层级关系的数据时非常有用,比如组织结构、文件目录或导航菜单等。本篇将深入探讨如何使用JavaScript实现这个...

    JS树状层级下拉菜单组件支持层级勾选

    1. **数据模型**:为了表示树状结构,我们需要定义一个数据模型来存储菜单项及其子项。这个模型通常包含属性如`label`(菜单文本)、`children`(子项数组)、`checked`(是否被选中)等。 2. **DOM操作**:...

    本体解析为树状结构的代码

    将本体解析为树状结构是一种常见的可视化方式,可以帮助用户更好地理解本体的层次结构和概念之间的关系。树状结构通常以节点表示概念,以边表示概念之间的关系。 ### 使用 Jena 构建本体树状结构 #### 1. 导入必要...

    js用闭包遍历树状数组的方法

    树状数组是一种常见的数据结构,它以层级化的方式存储信息,比如菜单结构、部门组织结构等。在这种结构中,每个节点可能包含一个或多个子节点,形成一个嵌套的层级关系。 当我们需要在树状数组中查找特定的项时,...

    jsp实现树状结构源码

    本项目提供了一个"jsp实现树状结构"的源码,它是一个完整的、可以直接使用的或进行自定义修改的解决方案。 树状结构(Tree Structure)在计算机科学中被广泛应用于数据组织,尤其在UI设计中,常用来表示层次关系的...

    一个树状结构列表.zip

    标题 "一个树状结构列表.zip" 提供的信息表明,这个压缩包包含了一个实现树状结构列表的开源项目。树状结构列表是一种数据呈现方式,它模仿了自然界中的树形结构,用于表示层次关系的数据。在计算机科学中,尤其是在...

    基于C++的树状数组(免费提供全部源码)

    树状数组的核心思想是利用树的层级结构,在对数组进行操作时,通过位运算快速定位和更新数据。 项目功能: 初始化树状数组: 创建一个树状数组,并初始化为0。 单点更新: 在特定位置添加一个值,并更新树状数组...

    zTree实现的简单的树状结构的城市demo.rar

    `zTree`是一个非常流行的JavaScript插件,专门用于创建动态的树状结构,它适用于数据展示、层级管理等多种场景。本示例——"zTree实现的简单的树状结构的城市demo",是一个面向新手的实践项目,旨在帮助初学者掌握...

    xml转为数组格式

    1. XML到数组的转换主要涉及到解析XML文档,然后将其结构映射到相应的数组结构中。这个过程通常分为两个步骤:解析XML和构建数组。 - 解析XML:使用解析器(如JavaScript的DOMParser,PHP的SimpleXMLElement,...

Global site tag (gtag.js) - Google Analytics