Javascript中扁平化数据结构与JSON树形结构转换详解

目录
  • 一. 先说简单的树形结构数扁平化处理
  • 二. 再讲将扁平化数据结构转JSON树状形结构
  • 扩充一个知识点:for in 与 for of 的区别 :
  • 总结

不废话,直接开干

一. 先说简单的树形结构数扁平化处理

上思想: 思想:采用递归,每个对象都有childern,只要有children属性提取出来将其放在空数组中 然后将对象的其他属性解构出来,最后将数组合并

上代码:

//已知JSON树状形结构的数据data
let data = [
             {id:1,title:'标题1',parent_id:0,},
             {id:2,title:'标题2',parent_id:0,
              children:[
                 {id:3,title:'标题2-1',parent_id:2,
                  children:[
                    {id:4,title:'标题3-1',parent_id:3,
                     children:[
                        {id:5,title:'标题4-1',parent_id:4}
                      ]}
                  ]},
                {id:6,title:'标题2-2',parent_id:2}
              ]
            }
           ],

   function flat(data){
            return data.reduce((pre,cur)=>{
                // console.log(cur);
                //此处将对象的children属性和值都解构在空数组中,将对象的其他属性和值都解构在i里面。
                const {children=[],...i}=cur;   // 注意 ...i 只能写在解构赋值的末尾,否则报错
                // console.log(i);
                // // console.log(children);
                return pre.concat([{...i}],flat(children))  //利用递归回调,数组合并,注意此处 {...i}是解构
            },[]);
        }
   console.log(flat(data)); 

这里用到了es6解构赋值 和不常用的Array.reduce,文章讲的不错,可以去看看。

二. 再讲将扁平化数据结构转JSON树状形结构

思想都在步骤里了。

老规矩上代码:

  //已知扁平化数据Arr
let Arr = [
            {id:1,title:'标题1',parent_id:0},
            {id:2,title:'标题2',parent_id:0},
            {id:3,title:'标题2-1',parent_id:2},
            {id:4,title:'标题3-1',parent_id:3},
            {id:5,title:'标题4-1',parent_id:4},
            {id:6,title:'标题2-2',parent_id:2},
          ];

     const result = []
     function fn(list){
          const remap = list.reduce((pre,cur)=>{  //###第一步:将数组转换成键值对的形式(键是id值,值是对象)
                // console.log(cur);
               pre[cur.id]=cur
                // console.log(pre);
               return pre
           },{})
                //console.log(remap);
               //###第二步,循环遍历数组,判断是不是(树状结构最外层,祖宗层数据)第一层的数据(本处就是parent_id等不等于0)
            for(let item of list){  //用普通的for循环也行,但是用for in 不行,只能获取数组的元素下标,或者对象的键
                console.log(item);
                if(item.parent_id===0){
                    result.push(item)
                    continue
                }
                // console.log(item.parent_id);
                // console.log(remap[item.parent_id]); //注意 obj[key] 就代表是对象的值value
                if(item.parent_id in remap) {   //换成else也可,目的将不是第一层的数据(parent_id不等于0)挑出来,并赋予一个children属性
                    const parent = remap[item.parent_id];
                    parent.children = parent.children || [];
                    // console.log(parent);
                    parent.children.push(item);
                    //console.log(parent);
                }
            }
            // console.log(result);
            return result
        }
      console.log(fn(Arr));

扩充一个知识点:for in 与 for of 的区别 :

for-in结构对 Array(数组)和Object(对象)都可以使用,但只能拿到数组元素下标或者对象的键;

而for-of结构在对Object(对象)使用时会报错,在数组是可以拿到数组元素。

const arr = [2,3,4]
const obj = {
    a:2,
    b:3,
    c:4
},

for (let item in arr){
    console.log(item);  // 0 , 1 , 2
}

for (let item of arr){
    console.log(item);  // 2 , 3 , 4
}

for (let item in obj){
    console.log(item)  // a ,b ,c
}

for (let item of obj ){
    console.log(item)  // Uncaught TypeError: arr is not iterable
}

总结

到此这篇关于Javascript中扁平化数据结构与JSON树形结构转换的文章就介绍到这了,更多相关js扁平化与JSON树形结构转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • js实现树形数据转成扁平数据的方法示例

    利用递归的方法循环树形数组,当遇到有children的对象再次调用递归函数循环children数组,每次循环的数据放入一个提前声明好的数组里,等所有递归函数执行完,这个数组即是想要得到的扁平数据数组. let res = [] const fn = (source)=>{ source.forEach(el=>{ res.push(el) el.children && el.children.length>0 ? fn(el.children) : ""

  • Javascript中扁平化数据结构与JSON树形结构转换详解

    目录 一. 先说简单的树形结构数扁平化处理 二. 再讲将扁平化数据结构转JSON树状形结构 扩充一个知识点:for in 与 for of 的区别 : 总结 不废话,直接开干 一. 先说简单的树形结构数扁平化处理 上思想: 思想:采用递归,每个对象都有childern,只要有children属性提取出来将其放在空数组中 然后将对象的其他属性解构出来,最后将数组合并 上代码: //已知JSON树状形结构的数据data let data = [ {id:1,title:'标题1',parent_id

  • JavaScript中十种一步拷贝数组的方法实例详解

    JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下. 1.扩展运算符(浅拷贝) 自从ES6出现以来,这已经成为最流行的方法.它是一个很简单的语法,但是当你在使用类似于React和Redux这类库时,你会发现它是非常非常有用的. numbers = [1, 2, 3]; numbersCopy = [...numbers]; 这个方法不能有效的拷贝多维数组.数组/对象值的拷贝是通过引用而不是值复制. // numbersCopy.push(4);

  • VirtualBox中最小化安装Centos8.1虚拟机的教程详解

    1.下载相关工具与镜像 下载链接 VirtualBox: https://download.virtualbox.org/virtualbox/6.1.8/VirtualBox-6.1.8-137981-Win.exe Centos8.1: https://mirrors.tuna.tsinghua.edu.cn/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso 安装VirtualBox 这个与正常软件一样选好位置一路跟着走就

  • JS前端二维数组生成树形结构示例详解

    目录 问题描述 实现步骤 完整代码 问题描述 前端在构建国家的省市区结构时,接口返回的不是树形结构,这个时候就需要我们进行转化.以下数据为例 [ [ { "districtId": 1586533852834, "parentCode": "000", "nodeCode": "000001", "name": "浙江省", "districtType&qu

  • JS数组扁平化、去重、排序操作实例详解

    本文实例讲述了JS数组扁平化.去重.排序操作.分享给大家供大家参考,具体如下: 在网上看到一个校招题目,已知一个数组var arr = [[1, 3, 2, 1],[5, 3, 4, 8, 5, 6, 5],[6, 2, 8, 9, [4, 11, 15, 8, 9, 12, [12, 13, [10], 14]]], 16],用js编写一个程序将这个数组扁平化,并得到一个升序且无重复值的数组.得到最终结果为:[1,2,3,4,5,6,8,9,10,11,12,13,14,15,16].下面对数

  • Javascript中判断一个值是否为undefined的方法详解

    前言 相信大家都知道当声明一个变量,并且没有给赋值的情况下,它的初始值是undefined.但是在javascript中,怎么检查一个值是否为undefined呢? 简单来说,在现代浏览器中,你可以安全的比较变量是否为undefined if (name === undefined) {...} 一些人反对直接使用undefined变量进行比较,因为在旧的浏览器中允许它的值被重新赋值,比如下面这样: undefined = "test" 在被重新赋值后,使用undefined指令将不能

  • JavaScript中style.left与offsetLeft的使用及区别详解

    如果父div的position定义为relative,子div的position定义为absolute,那么子div的style.left的值是相对于父div的值, 这同offsetLeft是相同的,区别在于: 1. style.left 返回的是字符串,如28px,offsetLeft返回的是数值28,如果需要对取得的值进行计算,还用offsetLeft比较方便. 2. style.left是读写的,offsetLeft是只读的,所以要改变div的位置,只能修改style.left. 3. s

  • javascript 中iframe高度自适应(同域)实例详解

    javascript 中iframe高度自适应(同域) 今天解决了iframe高度自适应的问题,不过这只是同域下的页面嵌入,以下是代码: function SetCwinHeight(){ var iframeid = document.getElementById("frame"); //frame是iframe的id if (document.getElementById) { if (iframeid && !window.opera) { if (iframei

  • JavaScript中html画布的使用与页面存储技术详解

    目录 一.JavaScript使用html中的画布 二.页面存储技术 一.JavaScript使用html中的画布 1.画布:页面中用于绘制图形的特殊区域 2.绘制图形的过程 (1)创建画布:使用html5中画布标签 <canvas id="id" width="宽度" height="高度"> </canvas> (2)JavaScript中获取画布 document.getElementById('id') (3)准备

  • android中px、sp与dp之间进行转换详解

    目录 相关名词解释 系统屏幕密度 单位换算方法 利用系统TypeValue类来转换 补充:sp与dp的区别 总结 由于Android手机厂商很多,导致了不同设备屏幕大小和分辨率都不一样,然而我们开发者要保持在不同设备上显示同样的视觉效果,就需要做一些适配效果. 相关名词解释 屏幕大小:通常指的是屏幕对角线的长度,使用“寸”为单位来衡量. 分辨率:指手机屏幕的像素点个数,例如:720*1280,指的是宽有720个像素点,高有1280个像素点. dpi:指的是每英寸像素,是由对角线上的像素点数除以屏

随机推荐