Xin's blog Xin's blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

Xin

英雄可不能临阵脱逃啊~
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

    • 知识点

    • 方法

      • js能力提升1
      • js能力提升2
      • JS随机打乱数组
      • 判断是否为移动端浏览器
      • 将一维数组按指定长度转为二维数组
      • 防抖与节流函数
      • JS获取和修改url参数
      • js常用方法
      • js数据类型及类型判断
      • 用最简洁的代码去实现indexOf
      • 清空数组的方法
      • filter()方法过滤时如何保留假值?
      • 监听img元素是否加载完成
      • 树形结构转一维数组
        • 关键代码
        • 使用
      • 过滤数两个数组中重复的元素
      • 因为数据类型导致的排序错乱问题
  • Vue

  • 组件与插件

  • css扩展语言

  • 学习笔记

  • 前端
  • JavaScript
  • 方法
ctrlwin
2021-11-17

树形结构转一维数组

# 树形结构转一维数组

# 关键代码

// 将treeObj中的所有对象,放入一个数组中,要求某个对象在另一个对象的children时,其parent_id是对应的它父对象的code
// 其原理实际上是数据结构中的广度优先遍历

tree2Arr(treeObj, rootid) {
    const temp = []; // 设置临时数组,用来存放队列
    const out = [];	// 设置输出数组,用来存放要输出的一维数组
    temp.push(treeObj);	
    let pid = rootid;  // 设置根元素的parent_id
    const obj = this.deepClone(treeObj);
    obj.parent_id = pid;
    delete obj["children"]; 
    out.push(obj);	// 将根元素存放入out中
    // 对树对象进行广度优先遍历
    while (temp.length > 0) {
        const first = temp.shift();
        const children = first.children;
        if (children && children.length > 0) {
            pid = first.code;
            const len = first.children.length;
            for (let i = 0; i < len; i++) {
                temp.push(children[i]);
                const obj = this.deepClone(children[i]);
                obj.parent_id = pid;
                delete obj["children"];
                out.push(obj);
            }
        }
    }
    return out;
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

深拷贝:

这里要补充一下,这里没有考虑基本类型的数据,是因为只有遇到对象类型的时候才会调这个方法,所以就不考虑基本类型的数据了。 当然也没考虑Date、Symbol等类型的数据,网上关于深拷贝的文章有很多了,就不再写了

deepClone(obj) {
    // 深拷贝方法
    if (obj === null || typeof obj !== "object") return obj;
    let cpObj = obj instanceof Array ? [] : {};
    for (let key in obj) cpObj[key] = this.deepClone(obj[key]);
    return cpObj;
},
1
2
3
4
5
6
7

# 使用

树形结构数据:

{
    "commodity": [
        {
            "code": "0001",
            "name": "商品1号",
            "children": [
                {
                    "code": "00011",
                    "name": "商品2号",
                    "children": []
                },
                {
                    "code": "00012",
                    "name": "商品3号",
                    "children": [
                        {
                            "code": "000111",
                            "name": "商品4号",
                            "children": [
                                {
                                    "code": "000112",
                                    "name": "商品5号",
                                    "children": []
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "code": "0002",
            "name": "商品6号",
            "children": [
                {
                    "code": "00021",
                    "name": "商品7号",
                    "children": [
                        {
                            "code": "00022",
                            "name": "商品8号",
                            "children": []
                        }
                    ]
                }
            ]
        },
        {
            "code": "0003",
            "name": "商品9号",
            "children": []
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

这里的数据格式由于是一个数组,每一个数组元素都是一个树形结构数据,所以可以用遍历的方式,将每一个树形结构数据转换,再添加到新数组中。

let data=dataJSON;
let dataList=[];
data.forEach(item=>{
    dataList.push(...tree2Arr(item, '/'));
})
1
2
3
4
5

树形结构数据

树形结构

转换后的一维数组数据

一维数组结构

参考:JS中树形对象与数组之间的相互转换 (opens new window)

在GitHub上编辑 (opens new window)
#js
上次更新: 1/20/2022, 11:27:12 AM

← 监听img元素是否加载完成 过滤数两个数组中重复的元素→

最近更新
01
createElement函数创建虚拟DOM
05-26
02
clipboard 剪切板属性
05-26
03
vue的权限管理
05-16
更多文章>
Theme by Vdoing | Copyright © 2021-2022 Xin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×