首页 > 其他分享 >将Js对象转化为树状结构

将Js对象转化为树状结构

时间:2022-10-24 09:35:41浏览次数:57  
标签:name parent 树状 pid Js 转化 item 父亲 id

实现效果

// 转换前:
source = [{
            id: 1,
            pid: 0,
            name: 'body'
          }, {
            id: 2,
            pid: 1,
            name: 'title'
          }, {
            id: 3,
            pid: 2,
            name: 'div'
          }]
// 转换为: 
tree = [{
          id: 1,
          pid: 0,
          name: 'body',
          children: [{
            id: 2,
            pid: 1,
            name: 'title',
            children: [{
              id: 3,
              pid: 1,
              name: 'div'
            }]
          }
        }]

思路分析

我们可以给这道题换个场景:
火车站,多个家庭混乱排列,一个父亲可能有多个孩子,每个人都知道自己的id和父亲的id(假设id唯一)以及自己的名字。
现在需要我们重新排列他们,复原家庭关系。
在实际生活中可以如何解决:

  1. 让所有人排好队,询问每一个人,你的pid是多少
  2. 如果他的pid为0,则说明他是父亲,我们直接将他放到另一边
  3. 如果他的pid不为0,则在大厅喊话:“谁的id是这个”
  4. 此时就会找到他的父亲,我们将这个儿子交给父亲
  5. 询问完所有的家庭,就完成了任务

提示:只是一个小案例,不要去纠结细节,ggg

代码实现

function jsonToTree (data) {
  if (!Array.isArray(data)) {
    return result
  }
  // 1. result为一个新的大厅,来存放已经组好队的家庭
  let result = []
  // 2.使用map,将当前对象的id与当前对象对应存储起来
  // PS:相当于我们在大厅喊话,只用一次就可以找到父亲,也就是O(1)
  let map = {}
  data.forEach(item => {
    map[item.id] = item
  })
  // 3.询问每一个人,它的父亲是谁
  data.forEach(item => {
    let parent = map[item.pid]
    console.log('打印的parent', parent)
    // 如果有父亲,就把父亲喊出来,把孩子交给父亲
    if (parent) {
      (parent.children || (parent.children = [])).push(item)
    }
    else {
    // 如果没有父亲,说明这个人就是父亲,直接把他带到排好序的大厅
      result.push(item)
    }

  })
  // 新的大厅为已经排好的家庭
  return result
}
console.log(jsonToTree(source))

标签:name,parent,树状,pid,Js,转化,item,父亲,id
From: https://www.cnblogs.com/zx529/p/16820400.html

相关文章

  • C# 配置EF接口报错:ObjectContent`1”类型未能序列化内容类型“application/json; char
    WebApi项目中,配置了EntityFramework,一顿LINQ操作后接口调试出现以下错误:{"Message":"出现错误。","ExceptionMessage":"“ObjectContent`1”类型未能序列化内容......
  • 关于jsp页面中的小细节们
    细节一:利用jsp判断文本框的输入格式是否正确也就是主要利用script标签进行判断,主要用到的是正则表达式(判断是否为整数);再加上if语句的配合,就能够在文本框的格式不正确时,发......
  • nvm nodejs版本管理用具
    nvm简介全称node.jsversionmanagement,nvm是nodejs版本管理用具。nvm可以快速切换使用不同版本的node。nvm下载地址按照提示安装安装完毕后,找到安装的路径,一些简单配......
  • redis采用fastjson序列化方式
    packagecom.wangbiao.security.config;importcom.alibaba.fastjson.support.spring.FastJsonRedisSerializer;importorg.springframework.context.annotation.Bean;......
  • JSTL C标签怎么判断参数是否为空
    有时候我们在使用JSTLC标签<c:if>语句的时候,想判断参数是否为空,怎么判断呢,下面来分享一下方法工具/原料JSTLC标签JSTLC标签判断参数是否为空方法方法/步骤第......
  • js中的防抖和节流
    先上结论:防抖:只执行最后一次 (常用语输入框)节流:控制执行的次数(常下拉滚动条时进行数据请求) 防抖代码:(这是未封装的,防抖代码和业务代码写在一起了)<body>......
  • 爬虫之利用selenium绕过js加载
    契子最近发现在ip被tx及其他大量收购,强取的背景下,网络小说很难诞生出有高质量的作品,为此,我计划爬取某个网站100本(再多就暴了)比较优质往年的小说解决精神上的匮乏构思一......
  • JSTL中taglib标签中uri和prefix的使用
    在早期的jsp开发中,是使用java代码来控制逻辑和显示的,但这样会给前端开发人员带来些麻烦并且代码的可读性也会降低。为了解决上述情况,标签库被创造出来了。标签库的目的在于......
  • #yyds干货盘点#JS中的map用法
    map()​​map()​​ 方法会返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。​​map​​​ 方法会给原数组中的每个元素都按顺序调用一次 ​​callback​​......
  • jsp 过滤器
    简介Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤......