天天看點

遞歸展開數組對象,根據主鍵遞歸查找樹形資料中對應的資料

/**
 *
 * @param {Object}
 * @param {Array} arr 數組對象
 * @param {String} childrenKey 子數組的key
 * @param {Number=} expandLevel 可選 展開的層級
 * @param {String=} levelKey 可選 樹形結構中元素的層級字段 層級從0開始 當expandLevel有值時 levelKey為必須
 * @param {Boolean=} noParents 傳回展開數組時不包含根節點 當root為true時 level為必須 否則預設為1
 * @example expandArrayObject({ arr, childrenKey[, level, root] })
 * @description 遞歸展開數組對象 預設展開時包含父節點
 */
export function expandArrayObject({
  arr,
  childrenKey,
  expandLevel,
  levelKey,
  noParents
}) {
  const list = []
  let currentLevel = 1
  const _level = expandLevel || (noParents && 1)
  let parentCode = null
  const recursiveExpand = (arr, pCode) => {
    parentCode = pCode
    if (_level && currentLevel > _level) {
      return
    }
    Array.isArray(arr) &&
      arr.forEach((item) => {
        currentLevel = item[levelKey] + 1
        if (noParents && currentLevel < _level) {
          recursiveExpand(item[childrenKey])
        } else {
          list.push(item)
          recursiveExpand(item[childrenKey])
        }
      })
  }
  recursiveExpand(arr, parentCode)
  return list
}

/**
 *
 * @param {Object}
 * @param arr 查找資料的元數組
 * @param childrenKey 子數組的key
 * @param codeKey 主鍵key
 * @param code 需要找到的元素的主鍵值
 * @description 根據主鍵遞歸查找樹形資料中對應的資料
 */
export function getChildrenRecursive({ arr, childrenKey, codeKey, code }) {
  let result
  arr.forEach((item) => {
    if (item[codeKey] === code) {
      result = item
    } else {
      getChildrenRecursive({
        arr: item[childrenKey],
        childrenKey,
        codeKey,
        code
      })
    }
  })
  return result
}
           

繼續閱讀