多层数组结构转换

问题描述

感谢查看!
今天碰到一个贼麻烦的数据结构转换,功能如图:
image.png

数据结构如下(这是最小化的):

const data = [
            {
                id: 1,
                label: "逻辑配置",
                logic: "且",
                ruleSelected: "=",
                selectedValue: ["性别", "男", "女"],
                children: [
                    {
                        id: 11,
                        label: "逻辑配置",
                        logic: "且",
                        ruleSelected: "=",
                        selectedValue: ["民族2", "汉族"],
                        children: []
                    }
                ]
            }, {
                id: 2,
                label: "逻辑配置",
                logic: "且",
                ruleSelected: "=",
                selectedValue: ["民族", "汉族"],
                chuldren: []
            }
        ]

他要转成这个格式:

const result = [
             {
                 historyLogic: '(性别 = 男 and 性别 = 男 and (民族2 = 汉族)) and (民族 = 汉族)',
                 num: 0,
             },
        ]

问题出现的环境背景及自己尝试过哪些方法

我也是挣扎过的……但是没想出来

相关代码

粘贴代码文本(请勿用截图)

你期待的结果是什么?实际看到的错误信息又是什么?

能满足多层嵌套的数据结构转换。
希望得到解答~

阅读 1.6k
2 个回答
var data = [
            {
                id: 1,
                label: "逻辑配置",
                logic: "且",
                ruleSelected: "=",
                selectedValue: ["性别", "男", "女"],
                children: [
                    {
                        id: 11,
                        label: "逻辑配置",
                        logic: "且",
                        ruleSelected: "=",
                        selectedValue: ["民族2", "汉族"],
                        children: []
                    },
                ]
            }, {
                id: 2,
                label: "逻辑配置",
                logic: "且",
                ruleSelected: "=",
                selectedValue: ["民族", "汉族"],
                children: []
            }
        ];

function getSchema(data) {
  return data.reduce((res, v) => {
    res = res.concat( v.selectedValue.slice(1).map(value => v.selectedValue[0] + ' = '+  value) )
    if(v.children && v.children.length) res.push(getSchema(v.children))
    return res;
  }, [])
}


function bracketsSchema(schema) {
    return schema.reduce((res, v, i) => {
    var isLast = i === schema.length - 1;
    if(Array.isArray(v)) res += bracketsSchema(v) + ')' + (isLast ? '' : ' and (');
    else res += v + (isLast ? ')' : ' and ');
    return res;
  },'(')
}

bracketsSchema(getSchema(data))

没有测试很多用例。

这个应该由后端来转吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题