如何处理这样一个数据?

作者站长头像
站长
· 阅读数 19
sweepPaperTree: [
    {
      title: '一、基础(40分) (共5题,共40.0分)',
      children: [
        {
          title: '1.填空题(8分)',
          idProp: 'questionId',
          code: 'completion',
          blankNum: 4,
        },
        {
          title: '2.单选题(8分)',
          idProp: 'questionId',
          code: 'single_choice',
        },
        {
          title: '3.判断题(8分)',
          idProp: 'questionId',
          code: 'judgment',
        },
        {
          title: '4.单选题(8分)',
          idProp: 'questionId',
          code: 'single_choice',
        },
        {
          title: '5.多选题(8分)',
          idProp: 'questionId',
          code: 'multiple_choice',
        },
        {
          title: '6.问答题(8分)',
          idProp: 'questionId',
          code: 'subjectivity',
        },
        {
          title: '7.判断题(8分)',
          idProp: 'questionId',
          code: 'judgment',
        },
        {
          title: '8.多选题(8分)',
          idProp: 'questionId',
          code: 'multiple_choice',
        },
      ],
    },
    {
      title: '二、阅读(40分) (共5题,共40.0分)',
      children: [
        {
          title: '6.复合题(40分)',
          idProp: 'questionId',
          code: 'complex',
          children: [
            {
              title: '6.(1)填空题(8分)',
              idProp: 'questionItemId',
              code: 'completion',
              blankNum: 4,
              showBorder: false,
            },
            {
              title: '6.(2)单选题(8分)',
              idProp: 'questionItemId',
              code: 'single_choice',
              showBorder: false,
            },
            {
              title: '6.(3)问答题(8分)',
              idProp: 'questionItemId',
              code: 'subjectivity',
            },
            {
              title: '6.(4)多选题(8分)',
              idProp: 'questionItemId',
              code: 'multiple_choice',
              showBorder: false,
            },
            {
              title: '6.(5)判断题(8分)',
              idProp: 'questionItemId',
              code: 'judgment',
              showBorder: false,
            },
          ],
        },
      ],
    },
    {
      title: '三、写作(50分) (共1题,共50.0分)',
      children: [
        {
          title: '7.问答题(50分)',
          idProp: 'questionId',
          code: 'subjectivity',
        },
      ],
    },
  ],

上分是原始数据,如何转换为下方的数据格式呢

sweepPaperTree: [
    {
      title: '一、基础(40分) (共5题,共40.0分)',
      children: [
        {
          title: '1.填空题(8分)',
          idProp: 'questionId',
          code: 'completion',
          blankNum: 4,
        },
        [{
          title: '2.单选题(8分)',
          idProp: 'questionId',
          code: 'single_choice',
        },
        {
          title: '3.判断题(8分)',
          idProp: 'questionId',
          code: 'judgment',
        },
        {
          title: '4.单选题(8分)',
          idProp: 'questionId',
          code: 'single_choice',
        },
        {
          title: '5.多选题(8分)',
          idProp: 'questionId',
          code: 'multiple_choice',
        }],
        {
          title: '6.问答题(8分)',
          idProp: 'questionId',
          code: 'subjectivity',
        },
        [{
          title: '7.判断题(8分)',
          idProp: 'questionId',
          code: 'judgment',
        },
        {
          title: '8.多选题(8分)',
          idProp: 'questionId',
          code: 'multiple_choice',
        }],
      ],
    },
    {
      title: '二、阅读(40分) (共5题,共40.0分)',
      children: [
        {
          title: '6.复合题(40分)',
          idProp: 'questionId',
          code: 'complex',
          children: [
            {
              title: '6.(1)填空题(8分)',
              idProp: 'questionItemId',
              code: 'completion',
              blankNum: 4,
              showBorder: false,
            },
            {
              title: '6.(2)单选题(8分)',
              idProp: 'questionItemId',
              code: 'single_choice',
              showBorder: false,
            },
            {
              title: '6.(3)问答题(8分)',
              idProp: 'questionItemId',
              code: 'subjectivity',
            },
            [{
              title: '6.(4)多选题(8分)',
              idProp: 'questionItemId',
              code: 'multiple_choice',
              showBorder: false,
            },
            {
              title: '6.(5)判断题(8分)',
              idProp: 'questionItemId',
              code: 'judgment',
              showBorder: false,
            }],
          ],
        },
      ],
    },
    {
      title: '三、写作(50分) (共1题,共50.0分)',
      children: [
        {
          title: '7.问答题(50分)',
          idProp: 'questionId',
          code: 'subjectivity',
        },
      ],
    },
  ],

具体规则的是这样的:主要区分code为single_choice、multiple_choice、judgment且若下一题也是这三者之一的话就归到一个数组中(必须是连续的单选多选判断),如果是其他类型的题型还是原位置即可

回复
1个回答
avatar
test
2024-07-03

function transformTree(list) {
  const CODES = new Set(['single_choice', 'multiple_choice', 'judgment']);

  return list.reduce((res, v, i) => {
    if(v.children) v.children = transformTree(v.children);
    const last = res[res.length-1];
    if(last && CODES.has(list[i-1].code) && CODES.has(v.code)) {
      if(Array.isArray(last)) last.push(v);
      else res[res.length-1] = [last, v];
      return res;
    }
    res.push(v);
    return res;          
  }, [])
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容