JavaScript扁平数据转tree与tree数据扁平化的方法

发布时间:2022-06-14 09:50:08 作者:zzz
来源:亿速云 阅读:137

JavaScript扁平数据转tree与tree数据扁平化的方法

在JavaScript开发中,我们经常会遇到需要将扁平化的数据结构转换为树形结构,或者将树形结构扁平化的需求。本文将介绍如何实现这两种转换,并提供相应的代码示例。

1. 扁平数据转tree

扁平数据通常是指一个数组,数组中的每个元素都有一个唯一的标识符(如id)和一个指向父元素的标识符(如parentId)。我们需要将这些数据转换为树形结构,其中每个节点包含其子节点。

1.1 实现思路

  1. 创建一个空对象map,用于存储每个节点的引用。
  2. 遍历扁平数据数组,将每个节点存储到map中,键为节点的id
  3. 再次遍历扁平数据数组,根据parentId将每个节点添加到其父节点的children数组中。
  4. 最后,找到所有没有父节点的节点(即根节点),并将它们作为树的根。

1.2 代码实现

function flatToTree(flatData) {
    const map = {};
    const tree = [];

    // 将每个节点存储到map中
    flatData.forEach(item => {
        map[item.id] = { ...item, children: [] };
    });

    // 构建树结构
    flatData.forEach(item => {
        if (item.parentId !== null && map[item.parentId]) {
            map[item.parentId].children.push(map[item.id]);
        } else {
            tree.push(map[item.id]);
        }
    });

    return tree;
}

// 示例数据
const flatData = [
    { id: 1, parentId: null, name: 'Root' },
    { id: 2, parentId: 1, name: 'Child 1' },
    { id: 3, parentId: 1, name: 'Child 2' },
    { id: 4, parentId: 2, name: 'Grandchild 1' },
    { id: 5, parentId: 2, name: 'Grandchild 2' }
];

const treeData = flatToTree(flatData);
console.log(JSON.stringify(treeData, null, 2));

1.3 输出结果

[
  {
    "id": 1,
    "parentId": null,
    "name": "Root",
    "children": [
      {
        "id": 2,
        "parentId": 1,
        "name": "Child 1",
        "children": [
          {
            "id": 4,
            "parentId": 2,
            "name": "Grandchild 1",
            "children": []
          },
          {
            "id": 5,
            "parentId": 2,
            "name": "Grandchild 2",
            "children": []
          }
        ]
      },
      {
        "id": 3,
        "parentId": 1,
        "name": "Child 2",
        "children": []
      }
    ]
  }
]

2. tree数据扁平化

树形结构的数据通常包含嵌套的子节点,我们需要将其扁平化为一个数组,每个节点包含其idparentId

2.1 实现思路

  1. 使用递归遍历树形结构。
  2. 对于每个节点,将其添加到结果数组中,并记录其idparentId
  3. 如果节点有子节点,递归处理每个子节点。

2.2 代码实现

function treeToFlat(treeData, parentId = null) {
    let flatData = [];

    treeData.forEach(node => {
        flatData.push({ id: node.id, parentId: parentId, name: node.name });
        if (node.children && node.children.length > 0) {
            flatData = flatData.concat(treeToFlat(node.children, node.id));
        }
    });

    return flatData;
}

// 示例数据
const treeData = [
    {
        id: 1,
        parentId: null,
        name: 'Root',
        children: [
            {
                id: 2,
                parentId: 1,
                name: 'Child 1',
                children: [
                    { id: 4, parentId: 2, name: 'Grandchild 1', children: [] },
                    { id: 5, parentId: 2, name: 'Grandchild 2', children: [] }
                ]
            },
            { id: 3, parentId: 1, name: 'Child 2', children: [] }
        ]
    }
];

const flatData = treeToFlat(treeData);
console.log(JSON.stringify(flatData, null, 2));

2.3 输出结果

[
  {
    "id": 1,
    "parentId": null,
    "name": "Root"
  },
  {
    "id": 2,
    "parentId": 1,
    "name": "Child 1"
  },
  {
    "id": 4,
    "parentId": 2,
    "name": "Grandchild 1"
  },
  {
    "id": 5,
    "parentId": 2,
    "name": "Grandchild 2"
  },
  {
    "id": 3,
    "parentId": 1,
    "name": "Child 2"
  }
]

3. 总结

本文介绍了如何将扁平数据转换为树形结构,以及如何将树形结构扁平化。这两种操作在前端开发中非常常见,尤其是在处理菜单、目录等数据结构时。通过掌握这些方法,可以更高效地处理复杂的数据结构。

推荐阅读:
  1. 扁平化处理字典
  2. JavaScript之数组扁平化详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascript tree

上一篇:Python怎么利用多线程爬取LOL高清壁纸

下一篇:jquery如何改css定位属性

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》