js 数据转换问题
题目
将下面的数据结构
[
{
"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": []
}]
}]
本文作者:makalo
本文链接:https://www.cnblogs.com/makalochen/p/17304318.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
2020-04-10 WebServcies 调用方法异常:System.Web.HttpRequestValidationException: 从客户端中检测到有潜在危险的 Request.Form 值。