vue项目如何将多层嵌套的数组转换为一层json串

vue项目如何将多层嵌套的数组转换为一层json串
比如将如下数据转换为一层json串

testArr: {
        index: "0",
        agree: "and",
        children: [
          {
            index: "1",
            name: "name1",
          },
          {
            index: "2",
            name: "name2",
          },
          {
            index: "3",
            agree: "or",
            children: [
              {
                index: "3_1",
                name: "name3_1",
              },
              {
                index: "3_2",
                name: "name3_2",
              },
            ],
          },
          {
            index: "4",
            agree: "and",
            children: [
              {
                index: "4_1",
                name: "name4_1",
              },
              {
                index: "4_2",
                name: "name4_2",
                agree: "or",
                children: [
                  {
                    index: "4_2_2",
                    name: "name4_2_2",
                  },
                  {
                    index: "4_2_1",
                    name: "name4_2_1",
                  },
                ],
              },
              {
                index: "4_3",
                name: "name4_3",
              },
            ],
          },
          {
            index: "5",
            name: "name5",
          },
          {
            index: "6",
            agree: "or",
            children: [
              {
                index: "6_1",
                name: "name6_1",
              },
              {
                index: "6_2",
                name: "name6_2",
              },
            ],
          },
          {
            index: "7",
            name: "name7",
          },
        ],
      },

输出为:

name1 and name2 and (name3_1 or name3_2) and (name4_1 and (name4_2_2 or name4_2_1) and name4_3) and name5 and (name6_1 or name6_2)

完整代码:

<template>
  <div><el-button @click="testClick">测试</el-button></div>
</template>

<script>
export default {
  name: "PdfView",
  components: {},
  data() {
    return {
      testArr: {
        index: "0",
        agree: "and",
        children: [
          {
            index: "1",
            name: "name1",
          },
          {
            index: "2",
            name: "name2",
          },
          {
            index: "3",
            agree: "or",
            children: [
              {
                index: "3_1",
                name: "name3_1",
              },
              {
                index: "3_2",
                name: "name3_2",
              },
            ],
          },
          {
            index: "4",
            agree: "and",
            children: [
              {
                index: "4_1",
                name: "name4_1",
              },
              {
                index: "4_2",
                name: "name4_2",
                agree: "or",
                children: [
                  {
                    index: "4_2_2",
                    name: "name4_2_2",
                  },
                  {
                    index: "4_2_1",
                    name: "name4_2_1",
                  },
                ],
              },
              {
                index: "4_3",
                name: "name4_3",
              },
            ],
          },
          {
            index: "5",
            name: "name5",
          },
          {
            index: "6",
            agree: "or",
            children: [
              {
                index: "6_1",
                name: "name6_1",
              },
              {
                index: "6_2",
                name: "name6_2",
              },
            ],
          },
          {
            index: "7",
            name: "name7",
          },
        ],
      },
      testArrNew: "",
    };
  },
  mounted() {},
  beforeDestroy() {},
  methods: {
    testClick() {
      console.log(this.handleArr(this.testArr.children, this.testArr.agree));
    },
    // 将多层数组拼接为一层,如下:
    // name1 and name2 and (name3_1 or name3_2) and (name4_1 and (name4_2_2 or name4_2_1) and name4_3) and name5 and (name6_1 or name6_2)
    handleArr(arr, agree) {
      let list = arr;
      list.forEach((item, index) => {
        if (Array.isArray(item.children)) {
          // 轮询有children,先加上(,如name1 and name2 and (
          this.testArrNew = this.testArrNew + " " + agree + " " + "(";
          this.handleArr(item.children, item.agree);
        } else {
          if (index == list.length - 1) {
            // 轮询结束,加上),除了第一层数据
            let linkName = ~item.index.indexOf("_") ? ")" : "";
            this.testArrNew =
              this.testArrNew + " " + agree + " " + item.name + linkName;
          } else {
            // 第一个前面无需空格,输出name1
            let agreeName = index > 0 ? " " + agree + " " : "";
            this.testArrNew = this.testArrNew + agreeName + item.name;
          }
        }
      });
      return this.testArrNew;
    },
  },
};
</script>
<style scoped>
</style>

效果:


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容