首页 > 其他分享 >js 数据转换问题

js 数据转换问题

时间:2023-04-10 21:25:28浏览次数:28  
标签:转换 title pid js children 标题 数据 id childNode

题目

将下面的数据结构

[
    {
        "id": "1",
        "pid": "",
        "title": "标题1"
    },
    {
        "id": "2",
        "pid": "1",
        "title": "标题2"
    },
    {
        "id": "3",
        "pid": "1",
        "title": "标题3"
    },
    {
        "id": "4",
        "pid":"2",
        "title": "标题4"
    }
]

转换为

[
    {
        "id": "1",
        "pid": "",
        "title": "标题1",
        "childNode": [
            {
                "id": "2",
                "pid": "1",
                "title": "标题2",
                "childNode": [
                    {
                        "id": "4",
                        "pid": "2",
                        "title": "标题4",
                        "childNode": []
                    }
                ]
            },
            {
                "id": "3",
                "pid": "1",
                "title": "标题3",
                "childNode": []
            }
        ]
    }
]

实现

递归

const data = `
[
    {
        "id": "1",
        "pid": "",
        "title": "标题1"
    },
    {
        "id": "2",
        "pid": "1",
        "title": "标题2"
    },
    {
        "id": "3",
        "pid": "1",
        "title": "标题3"
    },
    {
        "id": "4",
        "pid":"2",
        "title": "标题4"
    }
]
`;

// 递归
let jsonArr2 = JSON.parse(data)
console.log('jsonArr1 ------->', jsonArr2)

function add(rootId = "") {
    const childNode = jsonArr2.filter(item => item.pid == rootId)
    for (let index = 0; index < childNode.length; index++) {
        const element = childNode[index];
        // 查找该节点下是否还有其他节点
        element.childNode = add(element.id)
    }
    return childNode
}
var obj1 = add()
console.log('jsonArr2-------->', JSON.stringify(obj1))

返回

[{"id":"1","pid":"","title":"标题1","childNode":[{"id":"2","pid":"1","title":"标题2","childNode":[{"id":"4","pid":"2","title":"标题4","childNode":[]}]},{"id":"3","pid":"1","title":"标题3","childNode":[]}]}]

格式化一下

[{
	"id": "1",
	"pid": "",
	"title": "标题1",
	"childNode": [{
		"id": "2",
		"pid": "1",
		"title": "标题2",
		"childNode": [{
			"id": "4",
			"pid": "2",
			"title": "标题4",
			"childNode": []
		}]
	}, {
		"id": "3",
		"pid": "1",
		"title": "标题3",
		"childNode": []
	}]
}]

Map 实现

const data2 = `
[
    {
        "id": "1",
        "pid": "",
        "title": "标题1"
    },
    {
        "id": "2",
        "pid": "1",
        "title": "标题2"
    },
    {
        "id": "3",
        "pid": "1",
        "title": "标题3"
    },
    {
        "id": "4",
        "pid":"2",
        "title": "标题4"
    }
]
`;

let jsonArr2 = JSON.parse(data2)
console.log('jsonArr1 ------->', jsonArr2)
function arrayToTree(data) {
  	// 最终返回的数据
    const rootNodes = [];
  	// 元素映射map
    const itemMap = {};

    // 首先,将每个元素添加到项映射中
    data.forEach(item => {
        itemMap[item.id] = { ...item, children: [] };
    });

    // 然后,将子节点添加到其父节点的“children”数组中
    data.forEach(item => {
      	//判断是否有 父节点
        if (item.pid) {
          	// 如果存在,直接访问push 到 itemMap 的 children里
            itemMap[item.pid].children.push(itemMap[item.id]);
        } else {
          	// 不存在 则 说明 他的上一级就是根节点
          	// 则将 itemMap 当前节点的id push到最终要返回的map里
            rootNodes.push(itemMap[item.id]);
        }
    });

    return rootNodes;
}
var obj2 = arrayToTree(jsonArr2)
console.log('jsonArr2 ------->',JSON.stringify(obj2))

返回

[{"id":"1","pid":"","title":"标题1","children":[{"id":"2","pid":"1","title":"标题2","children":[{"id":"4","pid":"2","title":"标题4","children":[]}]},{"id":"3","pid":"1","title":"标题3","children":[]}]}]

格式化一下

[{
	"id": "1",
	"pid": "",
	"title": "标题1",
	"children": [{
		"id": "2",
		"pid": "1",
		"title": "标题2",
		"children": [{
			"id": "4",
			"pid": "2",
			"title": "标题4",
			"children": []
		}]
	}, {
		"id": "3",
		"pid": "1",
		"title": "标题3",
		"children": []
	}]
}]

标签:转换,title,pid,js,children,标题,数据,id,childNode
From: https://www.cnblogs.com/makalochen/p/17304318.html

相关文章

  • Js中delete的作用
    JavaScript中的delete用于删除对象的属性或数组的元素。它可以让你删除一个对象的指定属性或数组的指定元素。以下是使用delete来删除一个对象的属性的示例:constperson={name:"John",age:30,city:"NewYork"};deleteperson.age;console.log(person);//输出......
  • Django笔记二十一之使用原生SQL查询数据库
    本文首发于公众号:Hunter后端原文链接:Django笔记二十一之使用原生SQL查询数据库Django提供了两种方式来执行原生SQL代码。一种是使用raw()函数,一种是使用connection.cursor()。但是官方还是推荐在使用原生SQL之前,尽量的先去探索一下QuerySet提供的各种API。目前......
  • 使用WPS清理数据
    文章所用的方法适用于:表格有多行,每行有不同的列数,想合并列。比如,表格中“导演”占了很多列,每行中的导演数目又不相同,想合并导演列。         多次重复操作,直到合并完所有想要合并的列。......
  • 在DongshanPI-D1开箱使用分享与折腾记录&实现MPU6050数据读取
    前言上一篇文章使用RT-Smart的IIC驱动OLED屏幕,进行基本的字符串显示,在使用过程中对RT-Smart有了一定熟悉,准备使用SPI驱动ST7789,但SPI接口没有引出,本次使用手上已有的传感器MPU6050进行使用。过程本次直接开始添加离线包在/D1S/userapps/rt-thread/bsp/allwinner/d1s下输入scon......
  • JS-碰撞的小球
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • 类型转换
    1.强制转换     (类型)变量名   高到低2.自动转换    低到高注意点:1.不能对布尔值进行转换2.不能把对象类型转换为不相干的类型3.在把高容量转换到低容量的时候,强制转换4.转换是可能存在内存溢出,或精度问题!......
  • flask框架05 信号 flask-script命令 sqlalchemy创建操作数据表
    今日内容详细目录今日内容详细1信号1.1django信号2flask-script3sqlalchemy快速使用4sqlalchemy介绍和快速使用4.1sqlalchemy介绍和快速使用5创建操作数据表1信号#Flask框架中的信号基于blinker(安装这个模块),其主要就是让开发者可是在flask请求过程中定制一些用户行为......
  • 定义一个基类Object,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员hei
    定义一个基类Object,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数与析构函数的调用顺序。#include<bits/stdc++.h>usingnamespacestd;classObject{protected: doubleweight;public: Object(......
  • 学习笔记394—Windows 10 MySQL 数据库安装
    Windows10MySQL数据库安装1、MySQL的安装方式MySQL的社区版(MySQLCommunity)是免费的、开源的,像企业版这些是收费的,学习阶段使用社区版的即可。MySQL社区版在Windows10的安装方式可以分为两种,一种是使用安装程序安装,另一种是使用压缩包安装。个人倾向于使用压缩包......
  • JS函数的副作用你了解过吗?
    原文链接:   https://note.noxussj.top/?source=51cto什么是副作用?副作用会让一个函数变的不纯,纯函数是根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。副作用来源函数依赖外部状态(变量),但是副作用不可能完全禁止,尽可能控制在它们可控范......