/**
*
* @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
}