任务横跨多节点,js数据格式处理

当某个节点下的任务横跨多个节点时,需对数据进行改造成如下格式,才能正确展示

//改造前
[
 { node: '节点1', mission: [{ value: '节点1的任务一', tr: ['节点1', '节点2'] }, { value: '节点1的任务二', tr: ['节点1'] }] },
 { node: '节点2', mission: [{ value: '节点2的任务一', tr: ['节点2'] }, { value: '节点2的任务二', tr: ['节点2'] }] }
]
//改造后的数据
[
 [{label:"节点1的任务一",len:2 }],
 [{label:"节点1的任务二",len:1},{label:"节点2的任务一",len:1}],
 [{label:" ",len:1},{label:"节点2的任务二",len:1 }],
] 

改造函数

function resortFunc(data) {

  let maxLen = 0
  const { trMap, indexName } = createTrMap(data)
  for (let i = 0; i < data.length; i++) {
    const mission = data[i].mission
    for (let j = 0; j < mission.length; j++) {
      const tempMission = mission[j]
      tempMission.tr.forEach((element) => {
        const tempArr = trMap.get(element)
        tempArr.push(tempMission.value)
        maxLen = Math.max(maxLen, tempArr.length)
      })
    }
  }
  const res = createRowDirection(trMap, data, maxLen, indexName)
  return res
}

function createRowDirection(trMap, data, maxLen, indexName) {
  const result = new Array(maxLen)
  for (let j = 0; j < maxLen; j++) {
    result[j] = new Array(data.length).fill('')
  }
  for (let i = 0; i < data.length; i++) {
    const tempArr = trMap.get(indexName.get(i))
    for (let j = 0; j < tempArr.length; j++) {
      if (i > 0) {
        const index = checkBeforeSame(result, tempArr[j], maxLen, i - 1)
        result[index][i] = tempArr[j]
      } else {
        result[j][i] = tempArr[j]
      }
    }
  }
  const ActualResult = formatResult(result)

  return ActualResult
}

function formatResult(result) {
  const formatResult = []
  for (let i = 0; i < result.length; i++) {
    const tempResult = []
    let tempIndex = 0
    for (let j = 0; j < result[i].length; j++) {
      if (j > 1 && tempResult[tempIndex].label === result[i][j] && result[i][j] !== '') {
        tempResult[tempIndex] = { label: tempResult[tempIndex].label, len: tempResult[tempIndex].len + 1 }
      } else if (j > 0 && tempResult[tempIndex].label !== result[i][j]) {
        tempIndex += 1
        tempResult[tempIndex] = { label: result[i][j], len: 1 }
      } else if (j > 0 && tempResult[tempIndex].label === result[i][j]) {
        tempResult[tempIndex] = { label: result[i][j], len: tempResult[tempIndex].len + 1 }
      } else {
        tempResult[tempIndex] = { label: result[i][j], len: 1 }
      }
    }
    formatResult.push([...tempResult])
  }
  return formatResult
}

function checkBeforeSame(result, current, maxLen, beforeIndex) {
  for (let i = 0; i < maxLen; i++) {
    const beforeVal = result[i][beforeIndex]
    if (beforeVal !== '' && beforeVal === current) {
      return i
    }
  }
  // check current minimun index is empty
  for (let i = 0; i < maxLen; i++) {
    if (result[i][beforeIndex + 1] === '') {
      return i
    }
  }
}


function createTrMap(data) {
  const trMap = new Map()
  const indexName = new Map()
  for (let i = 0; i < data.length; i++) {
    trMap.set(data[i].node, [])
    indexName.set(i, data[i].node)
  }
  // console.log(trMap, indexName)
  return { trMap, indexName }
}


export { resortFunc }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值