个人记录---js数组转树的方法

90 阅读1分钟
数组数据
  const list = [
        {
          id: '1',
          name: 'qqq',
          sex: 0,
          parentId: 'root',
        },
        {
          id: '2',
          name: 'www',
          sex: 0,
          parentId: 'root',
        },
        {
          id: '3',
          name: 'eee',
          sex: 0,
          parentId: 'root',
        },
        {
          id: '1-1',
          name: 'rrr',
          sex: 0,
          parentId: '1',
        },
        {
          id: '1-2',
          name: 'ttt',
          sex: 0,
          parentId: '1',
        },
        {
          id: '2-1',
          name: 'yyy',
          sex: 0,
          parentId: '2',
        },
        {
          id: '3-1',
          name: 'uuu',
          sex: 0,
          parentId: '3',
        },
      ];

使用递归遍历 消耗性能

  function listToTree(arr, parentId) {
        return arr
          .filter((item) => item.parentId === parentId)
          .map((item) => {
            return {
              ...item,
              children: listToTree(list, item.id),
            };
          });
      }
      
      listToTree(list,'root')

利用对象存储键名

function listToTree(arr) {
        const map = {};
        const result = [];
        list.forEach((item) => {
          item.children = [];
          map[item.id] = { ...item };

          if (map[item.parentId]) {
            map[item.parentId].children.push(item);
          } else {
            result.push(item);
          }
        });

        return result;
      }