treeUtils.js

83 阅读1分钟
/**
 * 获取原数据结构的映射字段
 * @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; i < treeData.length; i++) {
      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; i < treeData.length; i++) {
      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 };