/**
* 获取原数据结构的映射字段
* @param {*} replaceFields 替换 treeNode 中 title,key,children 字段为 treeData 中对应的字段
* {children:'myChildren', title:'myTitle', key:'myKey', parentKey:'myParentKey',disabled:"myDisabled"}
* @returns
*/
function getFiledMaps(replaceFields) {
let filedMaps = {
key: "key",
title: "title",
children: "children",
parentKey: "parentKey",
disabled:"disabled",
disableCheckbox:"disableCheckbox",
}
if (replaceFields) {
filedMaps = replaceFields
}
return filedMaps
}
/**
* 将存在父子关系的 Aarry数据 转化成 Tree 结构
* @param {Array} srcArr
* @param {*} pKey 父节点的key,值为:null或0时,表示根节点
* @param {*} replaceFields 替换 treeNode 中 title,key,children 字段为 treeData 中对应的字段
* {children:'myChildren', title:'myTitle', key:'myKey', parentKey:'myParentKey',disabled:"myDisabled"}
* @returns
*/
function toTreeData(srcArr, pkey, replaceFields) {
const filedMaps = getFiledMaps(replaceFields)
//pkey:父节点key
function treeData(pkey) {
let arr = []
srcArr
.filter((item) => {
return item[filedMaps["parentKey"]] === pkey
})
.forEach((item) => {
let node = {
key: item[filedMaps["key"]],
title: item[filedMaps["title"]],
children: treeData(item[filedMaps["key"]]),
parentKey: pkey,
disabled:item[filedMaps["disabled"]],
disableCheckbox:item[filedMaps["disableCheckbox"]],
}
arr.push(node)
})
return arr
}
return treeData(pkey)
}
//根据某个节点,获取所有祖先节点
function getFamilyTreeNodes(treeData, pkey) {
var temp = []
var forFn = function(treeData, pkey) {
for (var i = 0
var item = treeData[i]
if (item.key == pkey) {
temp.push(item)
forFn(treeData, item.parentKey)
}
}
}
forFn(treeData, pkey)
return temp
}
function findTreeNode(treeData, key) {
let parentNode = null
var forFn = function(treeData, key) {
for (var i = 0
var item = treeData[i]
if (item.key == key) {
parentNode = item
break
} else {
forFn(item.children, key)
}
}
}
forFn(treeData, key)
return parentNode
}
function getFamilyTreeNodeKeys(treeData, key) {
const familykeys = []
const currNode = findTreeNode(treeData, key)
if (currNode) {
const familyNodes = getFamilyTreeNodes(treeData, currNode.parentKey)
if (familyNodes) {
familyNodes.forEach((n) => {
familykeys.push(n.key)
})
}
}
return familykeys
}
export { toTreeData, getFamilyTreeNodeKeys, getFamilyTreeNodes, findTreeNode }