为了账号安全,请及时绑定邮箱和手机立即绑定

二维数组加对应关系转换成树形结构的问题

二维数组加对应关系转换成树形结构的问题

慕田峪4524236 2019-02-11 16:18:22
石墨文档:https://shimo.im/docs/h2J6PUv...希望通过源数据结构转换成目标树形结构,直接从人的角度可以拼出结果,但如何通过代码实现转换?请大家帮忙,谢谢!最终需要实现的语言 JS,其他语言也可以提供下代码思路目标表格源数据结构1. 数据 (表格原始数据)[["报表测试","","","","","1"],["单元格", "","跨行合并","指标列","","2"],["statis_date","公司","","太原","福州","4"]]2. 关系 (表示单元格的合并行和列的情况)[ { col: 0, colspan: 5, row: 0, rowspan: 1 }, { col: 0, colspan: 2, row: 1, rowspan: 1 }, { col: 2, colspan: 1, row: 1, rowspan: 2 }, { col: 3, colspan: 2, row: 1, rowspan: 1 },]3.说明关系中 col 代表 列序号, row 代表 行序号, colspan 代表 跨列数 ,rowspan 代表 跨行数合并不能仅依靠空数据就合并,需要根据关系进行定位合并的位置,空可能也会单独单元格显示存在一条默认的关系即,没有在关系中标识的单元格的关系即为 colspan 1 rowspan 1目标数据结构目标数据中 层级 表示 行,子元素表示下面的列内容需要实现行合并和列合并
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

直接 DFS 遍历一遍即可。当然,你的数据能生成树的前提是每个项的中间不会对应上一行某个项的开始。

function genTree (data, relations) {


  const relationMap = relations.reduce((map, rel) => map.set(`${rel.row},${rel.col}`, rel), new Map())


  const root = []


  _gen(root, data, 0, 0, data[0].length, relationMap)


  return root


  function _gen (children, data, row, colStart, colEnd, relationMap) {

    if (row >= data.length) { return }


    for (let col = colStart; col < colEnd;) {

      const lastSameHeadRel = relationMap.get(`${row - 1},${col}`)

      if (lastSameHeadRel && lastSameHeadRel.row + lastSameHeadRel.rowspan > row) {

        // 跨行占位

        col += lastSameHeadRel.colspan

        break

      }


      let child = {

        label: data[row][col],

        children: []

      }


      children.push(child)


      const relation = relationMap.get(`${row},${col}`)

      const nextRow = row + (relation ? relation.rowspan : 1)

      const nextColStart = col

      const nextColEnd = col + (relation ? relation.colspan : 1)

      _gen(child.children, data, nextRow, nextColStart, nextColEnd, relationMap)


      col = nextColEnd

    }

  }

}

const data = [

  ["报表测试","","","","","1"],

  ["单元格", "","跨行合并","指标列","","2"],

  ["statis_date","公司","","太原","福州","4"]

]


const relations = [

  { col: 0, colspan: 5, row: 0, rowspan: 1 },

  { col: 0, colspan: 2, row: 1, rowspan: 1 },

  { col: 2, colspan: 1, row: 1, rowspan: 2 },

  { col: 3, colspan: 2, row: 1, rowspan: 1 },

]


console.log(JSON.stringify(genTree(data, relations), null, '  '))


查看完整回答
反对 回复 2019-02-27
  • 1 回答
  • 0 关注
  • 554 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号