在vue中数组对象转换为tree

Posted drblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在vue中数组对象转换为tree相关的知识,希望对你有一定的参考价值。

直接上代码:

<template>
  <div>
    <ul>
      <li v-for="list in datas(dataList)" :key="list.id">
        <!-- {{list}} -->
        <span>{{list.name}}</span>
        <ul>
          <li v-for="(item,index) in  list.children" :key="index">
            <span>{{item.name}}</span>
            <ul>
              <li v-for="(items,index) in  item.children" :key="index">{{items.name}}</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      dataList: [
        { id: 1, parentId: null, name: "世界" },
        { id: 2, parentId: 1, name: "中国" },
        { id: 201, parentId: 2, name: "湖南" },
        { id: 202, parentId: 2, name: "广东" },
        { id: 3, parentId: 1, name: "US" },
        { id: 302, parentId: 3, name: "California" },
        { id: 308, parentId: 3, name: "Washington" }
      ]
    };
  },
  computed: {
    datas() {
      return function translateDataToTree(data) {
        let parents = data.filter(
          value => value.parentId == "undefined" || value.parentId == null
        );
        let children = data.filter(
          value => value.parentId !== "undefined" && value.parentId != null
        );
        let translator = (parents, children) => {
          // 遍历父节点数据
          parents.forEach(parent => {
            // 遍历子节点数据
            children.forEach((current, index) => {
              // 当父节点对应的一个子节点相等时
              if (current.parentId === parent.id) {
                //对子节点数据进行深复制,防止当temp改变而改变子节点
                let temp = JSON.parse(JSON.stringify(children));
                // 让当前子节点从temp中移除,temp作为新的子节点数据
                temp.splice(index, 1);
                // 让当前子节点作为唯一的父节点,去递归查找其对应的子节点
                translator([current], temp);
                // 把找到子节点放入父节点的children属性中
                typeof parent.children !== "undefined"
                  ? parent.children.push(current)
                  : (parent.children = [current]);
              }
            });
          });
        };
        // 调用转换方法
        translator(parents, children);
        //返回
        return parents;
      };
    }
  }
};
</script>

以上是关于在vue中数组对象转换为tree的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组转换为 Vue js 和 php 中的对象

使用 vue.js 将二维关联数组转换为 Object

Vue 字符串与Json对象数组之间的转换

Vue Array 转换为 Proxy 对象

将文本数组转换为下拉项目?

在java中把数据库中的Tree Structure转换为JSON对象?