import { get, cloneDeep, keys, find, isEmpty } from 'lodash' import { IBasicCascaderOptionItem, IBasicCascaderOptionListItem } from '@/types' import { TreeItem } from '@/types' const findNodeById = ( tree: TreeItem[], actived = '', isFilterHide: boolean ) => { for (let i = 0; i < tree?.length; i++) { if (tree[i].actived == actived) { return isFilterHide ? (tree[i].hide ? null : tree[i]) : tree[i] } if (tree[i].children) { const newTree: TreeItem[] = isFilterHide ? (tree[i].children as TreeItem[]).filter((t: TreeItem) => !t.hide) : (tree[i].children as TreeItem[]) const result: TreeItem = findNodeById( newTree, actived, isFilterHide ) as TreeItem if (result) { return result } } } } export const transMultSelectOptions = ( sourceOptions: IBasicCascaderOptionItem[], isFilterHide = true ) => { let tree: TreeItem[] = [] const newOptions = cloneDeep(sourceOptions) newOptions.map((item: IBasicCascaderOptionItem) => { if (tree.length === 0) { let list = get(item, 'list.1', []) if (isFilterHide) { list = list.filter((t: TreeItem) => !t.hide) } return (tree = tree.concat(list)) } Object.keys(item.list).map(l => { // 在树中找到l对应的节点,将当前数组放到children里面 const result: TreeItem = findNodeById(tree, l, isFilterHide) as TreeItem result && (result.children = isFilterHide ? item.list[l as unknown as number].filter((t: TreeItem) => !t.hide) : item.list[l as unknown as number]) }) }) return tree } export const findLabelBySelectValue = ( values: string[], options: IBasicCascaderOptionItem[] ) => { if (isEmpty(values)) return [] const newKV: { label: string; actived: string }[] = [] values?.map((value, index) => { const list = options[index]['list'] const flatt = keys(list).reduce( (next: IBasicCascaderOptionListItem[], cur: string | number) => { const newList = list[cur as number]?.map(item => { return item?.actived ? { ...item, actived: String(item.actived), tempActived: item.actived } : item }) return next.concat(newList) }, [] ) const label = get(find(flatt, { actived: String(value) }), 'label', '') const actived = get( find(flatt, { actived: String(value) }), 'tempActived', '' ) newKV.push({ label, actived }) }) return newKV } export const findTreeLabelBySelectValue = ( treeList: TreeItem[], values: string[] = [], propValue: keyof TreeItem & string, list: string[] = [] ) => { if (values?.length && treeList?.length) { for (let i = 0; i <= treeList.length; i++) { const tree = treeList[i] if ( values.includes( (tree?.[propValue] as unknown as string | number)?.toString?.() ) ) { list.push(tree.label) if (tree?.children?.length) { findTreeLabelBySelectValue(tree.children, values, propValue, list) } return list } } } else { return list } }