当某个节点下的任务横跨多个节点时,需对数据进行改造成如下格式,才能正确展示
//改造前
[
{ 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 }