
在前端开发或数据处理中,我们经常会遇到需要将扁平化数组转换为具有层级关系的数据结构。假设我们有一个JSON数组,其中每个对象都包含一个metaData.level属性,表示其在层级结构中的深度:
const content = [
{ title: "Item 1", metaData: { "level": 1, "desc": "Some Desc 1", "displayOnOverview": true }},
{ title: "Item 2", metaData: { "level": 2, "desc": "Some Desc 2", "displayOnOverview": true }},
{ title: "Item 3", metaData: { "level": 2, "desc": "Some Desc 3", "displayOnOverview": false }},
{ title: "Item 4", metaData: { "level": 3, "desc": "Some Desc 4", "displayOnOverview": true }},
{ title: "Item 5", metaData: { "level": 1, "desc": "Some Desc 5", "displayOnOverview": true }}
];我们的目标是将其转换为一个嵌套的JSON结构,其中子项通过subNav属性连接,如下所示:
[
{
"title": "Item 1",
"metaData": {
"level": 1,
"desc": "Some Desc 1",
"displayOnOverview": true
},
"subNav": [
{
"title": "Item 2",
"metaData": {
"level": 2,
"desc": "Some Desc 2",
"displayOnOverview": true
}
},
{
"title": "Item 3",
"metaData": {
"level": 2,
"desc": "Some Desc 3",
"displayOnOverview": false
},
"subNav": [
{
"title": "Item 4",
"metaData": {
"level": 3,
"desc": "Some Desc 4",
"displayOnOverview": true
}
}
]
}
]
},
{
"title": "Item 5",
"metaData": {
"level": 1,
"desc": "Some Desc 5",
"displayOnOverview": true
}
}
]直接通过数组索引判断父子关系(如root[index - 1])在多级嵌套中是不可行的,因为它无法准确追踪任意深度的父节点。我们需要一种更灵活的机制来识别并连接父子节点。
解决这个问题的关键在于,在遍历扁平化数组时,我们需要能够快速找到当前项的直接父节点。由于层级关系由metaData.level定义,我们可以维护一个映射表来存储每个层级的“最新”父节点。
立即学习“Java免费学习笔记(深入)”;
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
具体步骤如下:
以下是使用JavaScript实现上述逻辑的完整代码:
const content = [
{ title: "Item 1", metaData: { "level": 1, "desc": "Some Desc 1", "displayOnOverview": true }},
{ title: "Item 2", metaData: { "level": 2, "desc": "Some Desc 2", "displayOnOverview": true }},
{ title: "Item 3", metaData: { "level": 2, "desc": "Some Desc 3", "displayOnOverview": false }},
{ title: "Item 4", metaData: { "level": 3, "desc": "Some Desc 4", "displayOnOverview": true }},
{ title: "Item 5", metaData: { "level": 1, "desc": "Some Desc 5", "displayOnOverview": true }}
];
/**
* 将扁平化JSON数组转换为基于level属性的多级嵌套结构。
* @param {Array<Object>} data 包含level属性的扁平化数据数组。
* @returns {Array<Object>} 转换后的嵌套结构数组。
*/
function buildNestedStructure(data) {
const topLevelItems = []; // 存储所有顶层(level 1)的节点
const itemMap = {}; // 映射表,键为层级,值为该层级的最新节点
for (const item of data) {
const { title, metaData } = item;
// 创建一个新对象,包含title和完整的metaData,避免直接修改原始数据
const newItem = { title, metaData };
if (metaData.level === 1) {
// 如果是顶层节点,直接添加到结果数组
topLevelItems.push(newItem);
} else {
// 如果是子节点,找到其父节点
const parentLevel = metaData.level - 1;
const parentItem = itemMap[parentLevel]; // 从映射表中获取父节点
if (!parentItem) {
// 理论上不应该发生,除非数据顺序不正确(如level 2出现在level 1之前)
console.warn(`Warning: Parent for level ${metaData.level} not found. Item:`, item);
continue;
}
// 如果父节点还没有 subNav 数组,则初始化
if (!parentItem.subNav) {
parentItem.subNav = [];
}
// 将当前节点添加到父节点的 subNav 中
parentItem.subNav.push(newItem);
}
// 更新 itemMap,将当前节点设置为其所在层级的最新节点
// 这样,后续同一层级或更深层级的节点可以找到正确的父节点
itemMap[metaData.level] = newItem;
}
return topLevelItems;
}
const output = buildNestedStructure(content);
console.log(JSON.stringify(output, null, 2));通过维护一个层级映射表,我们可以有效地将扁平化的JSON数组转换为任意深度的嵌套结构。这种方法既高效又灵活,是处理此类数据转换问题的常用模式。理解itemMap在追踪父节点和更新当前层级最新节点方面的作用,是掌握这一技巧的关键。
以上就是将扁平化JSON数据转换为多级嵌套结构:JavaScript实现指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号