sard-uniapp
Version:
sard-uniapp 是一套基于 Uniapp + Vue3 框架开发的兼容多端的 UI 组件库
57 lines (56 loc) • 2 kB
JavaScript
import { isNullish } from '../../utils';
export const defaultCascaderProps = {
options: () => [],
};
export const defaultFieldKeys = {
label: 'label',
value: 'value',
disabled: 'disabled',
children: 'children',
isLeaf: 'isLeaf',
};
export function getSelectedOptionsByValue(options, value, fieldKeys, multiple) {
// 多选
if (multiple) {
if (Array.isArray(value)) {
return value
.map((item) => getSelectedOptionsByValue(options, item, fieldKeys))
.filter((item) => Array.isArray(item) ? item.length !== 0 : !isNullish(item));
}
}
// 单选
else {
// 全路径
if (Array.isArray(value)) {
const selectedOptions = [];
let list = options;
for (const item of value) {
const option = list.find((option) => option[fieldKeys.value] === item);
if (!option)
break;
selectedOptions.push(option);
list = option[fieldKeys.children];
if (!Array.isArray(list))
break;
}
return selectedOptions;
}
// 最后一级
else {
for (const option of options) {
// 优先在子结点中查找,找到后再向上回溯路径
// 这样可以处理存在重复值场景时候更偏向于更深层次的选项
if (Array.isArray(option[fieldKeys.children])) {
const selectedOptions = getSelectedOptionsByValue(option[fieldKeys.children], value, fieldKeys, multiple);
if (selectedOptions) {
return [option, ...selectedOptions];
}
}
if (option[fieldKeys.value] === value) {
return [option];
}
}
}
}
}
export const cascaderOptionsContextSymbol = Symbol('cascader-options');