vue tree树状结构 将普通数据转换为树状结构所需的数据类型(保留排序)

<template>
    <div>
        <el-tree
        ref="tree"
        node-key="objectId"
        :data="treeData"
        :props="props"
        :expand-on-click-node="false"
        default-expand-all
        highlight-current
        ></el-tree>
    </div>
</template>
<script>
export default {
    data(){
        return{
          data:[
              {
                createdAt: "2019-07-10T05:43:22.898Z",
                name: "公安",
                objectId: "rOYDUivsCb",
                path: "",
                updatedAt: "2019-07-10T05:43:22.898Z",
				sort:0,
              },
              {
                createdAt: "2019-07-15T06:58:30.615Z",
                description: "",
                name: "机构一",
                objectId: "wuLLHGaVjs",
                parent: "rOYDUivsCb",
                permissions: [],
                updatedAt: "2019-07-15T06:58:30.615Z",
				sort:2
              },
              {
                createdAt: "2019-07-15T06:58:40.671Z",
                description: "",
                name: "机构二",
                objectId: "VvWhkeujpo",
                parent: "wuLLHGaVjs",
                permissions: [],
                updatedAt: "2019-07-15T06:58:40.671Z",
				sort:1
              }
          ],
          treeData:[],
          props: {
                label: "name"
            }
        }
    },
    async mounted(){
       this.treeData = await this.toTree(this.data, "objectId", "parent","sort");
    },
    methods:{
        //转换成树状结构所需要的data格式
        toTree(objects, keyName, parentKeyName,sortKeyName) {
			if (!keyName) {
				throw "keyName argument is required";
			}
			if (!parentKeyName) {
				throw "parentKeyName argument is required";
			}

			// 列表项字典 将数组变成以objectId分组的对象,类似于{Vvwkeujpo:{},Rohdsfdofj:{}}
			var map = {};
			var source = {};
			objects.forEach(x => {
				map[x[parentKeyName] + x[sortKeyName]] = Object.assign({}, x);
				source[x[keyName]] = Object.assign({}, x);
			});
			// 已添加到父项的键
			var pushed = {};
			// 遍历列表项,将子项添加到父项的 children 数组
			for (const key in map) {
				if (map.hasOwnProperty(key)) {// 这样就可以过滤掉原型链上的可枚举属性了
					const x = map[key];
					if (x && x[keyName] && x[parentKeyName]>=0) {
						var parent = source[x[parentKeyName]];
						if (parent) {
							if (!parent.children) {
								parent.children = [];
							}
							parent.children.push(source[x[keyName]]);
							pushed[x[keyName]] = true;
						}
					}
				}
			}

			// 排除已添加到父项的项得到树
			var tree = [];
			for (const key in map) {
				if (map.hasOwnProperty(key)) {
					const x = map[key];
					if (!pushed[x[keyName]]) {
						tree.push(source[x[keyName]]);
					}
				}
			}
			return tree;
		}
    }
}
</script>
<style lang="scss" scoped>
.el-tree {
  font-size: 13px;
  background: #fafafa; // #eee;
  padding: 5px;
  // /deep/.tree_text {
  //   overflow: hidden;
  //   text-overflow: ellipsis;
  //   white-space: nowrap;
  //   display: inline-block;
  //   width: 80px;
  // }
}
</style>
 

 参照原博主的代码,做了下优化,能够保留后台数据的顺序,作为排序的字段是int类型

https://blog.csdn.net/weixin_42598901/article/details/95202315icon-default.png?t=M276https://blog.csdn.net/weixin_42598901/article/details/95202315

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值