最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue將后端數(shù)據(jù)轉(zhuǎn)成樹形結構的方法示例代碼

 更新時間:2025年06月14日 10:06:31   作者:ShareJasmine  
vue是一款流行的前端框架,其中很多操作都是基于數(shù)組進行的,這篇文章主要介紹了Vue將后端數(shù)據(jù)轉(zhuǎn)成樹形結構的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1. 前言

需要將后端傳來的數(shù)據(jù)轉(zhuǎn)成嵌套的樹形結構,后端數(shù)據(jù)形式如下:

[
  {
    "id": 48,
    "parentId": 47,
    "workspaceName": "工藝計劃書合集",
    "workspaceCode": "A8-B1"
  },
  {
    "id": 47,
    "parentId": null,
    "workspaceName": "工藝計劃書",
    "workspaceCode": "A8"
  },
  {
    "id": 26,
    "parentId": null,
    "workspaceName": "0501DKD工作指導書",
    "workspaceCode": "A2"
  },
  {
    "id": 29,
    "parentId": 26,
    "workspaceName": "月度計劃工藝包裝方案A",
    "workspaceCode": "A2-B1"
  },
  {
    "id": 35,
    "parentId": 26,
    "workspaceName": "月度計劃工藝包裝方案B",
    "workspaceCode": "A2-B2"
  }
]

2. 思路

首先,這里parentIdnull的是一級父節(jié)點,然后其他parentId有值的掛在對應id節(jié)點之后,最后整理的結果應該是這樣一個效果:

[
  {
    "id": 47,
    "parentId": null,
    "workspaceName": "工藝計劃書",
    "workspaceCode": "A8",
    "children": {
      "id": 48,
      "parentId": 47,
      "workspaceName": "工藝計劃書合集",
      "workspaceCode": "A8-B1"
    }
  },
  {
    "id": 26,
    "parentId": null,
    "workspaceName": "0501DKD工作指導書",
    "workspaceCode": "A2",
    "children": [
      {
        "id": 29,
        "parentId": 26,
        "workspaceName": "月度計劃工藝包裝方案A",
        "workspaceCode": "A2-B1"
      },
      {
        "id": 35,
        "parentId": 26,
        "workspaceName": "月度計劃工藝包裝方案B",
        "workspaceCode": "A2-B2"
      }
    ]
  }
]

3. 代碼

第一種是使用ES6的map語法:

function listToTree(data) {
  const map = new Map();
  const tree = [];

  // 第一步:遍歷數(shù)據(jù),將每一項存入 Map 中,并初始化 children = []
  data.forEach((p) => {
    p.children = [];
    // 將節(jié)點的 id 作為 key,整個節(jié)點對象作為 value 存入 Map
    map.set(p.id, p);
  });

  // 第二步:再遍歷一次數(shù)據(jù),根據(jù) parentId 找到父節(jié)點,并將當前節(jié)點加入父節(jié)點的 children
  data.forEach((p) => {
    // 找到父節(jié)點,把當前節(jié)點掛載為其子節(jié)點
    // 注意由于 map 中的值為一個對象,屬于引用數(shù)據(jù)類型,所以這里處理 map,就可以實現(xiàn) tree 中出現(xiàn)相應的嵌套數(shù)據(jù)
    if (p.parentId !== null && map.has(p.parentId)) {
      map.get(p.parentId).children.push(p);
    } else {
      // 如果 parentId 為 null 或找不到父節(jié)點,則是頂級節(jié)點,加入 tree 根節(jié)點數(shù)組
      tree.push(p);
    }
  });

  return tree;
}

第二種是若依框架的兼容IE瀏覽器的寫法:

/**
 * 構造樹型結構數(shù)據(jù)
 * @param {*} data 數(shù)據(jù)源
 * @param {*} id id字段 默認 'id'
 * @param {*} parentId 父節(jié)點字段 默認 'parentId'
 * @param {*} children 孩子節(jié)點字段 默認 'children'
 */
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children',
  };

  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];

  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }

  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      tree.push(d);
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t);
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  return tree;
}

4. 完整演示Demo

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>

<body></body>

<script>
  const data = [
    {
      id: 48,
      parentId: 47,
      workspaceName: '工藝計劃書合集',
      workspaceCode: 'A8-B1',
    },
    {
      id: 47,
      parentId: null,
      workspaceName: '工藝計劃書',
      workspaceCode: 'A8',
    },
    {
      id: 26,
      parentId: null,
      workspaceName: '0501DKD工作指導書',
      workspaceCode: 'A2',
    },
    {
      id: 29,
      parentId: 26,
      workspaceName: '月度計劃工藝包裝方案A',
      workspaceCode: 'A2-B1',
    },
    {
      id: 35,
      parentId: 26,
      workspaceName: '月度計劃工藝包裝方案B',
      workspaceCode: 'A2-B2',
    },
  ];

  function listToTree(data) {
    const map = new Map();
    const tree = [];

    data.forEach((p) => {
      p.children = [];
      map.set(p.id, p);
    });

    data.forEach((p) => {
      if (p.parentId !== null && map.has(p.parentId)) {
        map.get(p.parentId).children.push(p);
      } else {
        tree.push(p);
      }
    });

    return tree;
  }

  const result = listToTree(data);

  console.log('result:', result);
</script>

</html>

總結

到此這篇關于Vue將后端數(shù)據(jù)轉(zhuǎn)成樹形結構的文章就介紹到這了,更多相關Vue后端數(shù)據(jù)轉(zhuǎn)成樹形結構內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

铜鼓县| 乌鲁木齐市| 呼玛县| 临西县| 德格县| 揭东县| 台山市| 彭泽县| 彭山县| 贺兰县| 普洱| 德江县| 沐川县| 修文县| 巴青县| 万安县| 当雄县| 峨眉山市| 曲阳县| 佛冈县| 陆河县| 伊通| 宝山区| 连平县| 山西省| 越西县| 新巴尔虎右旗| 四川省| 高唐县| 合肥市| 玉树县| 长治县| 五台县| 柳江县| 衢州市| 井冈山市| 板桥市| 房产| 铜鼓县| 商都县| 区。|