You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.7 KiB
82 lines
2.7 KiB
7 months ago
|
import { get, isArray, isFunction, isObject, isString, isUndefined } from 'lodash-es';
|
||
|
|
||
|
export function useParams() {
|
||
|
function getParams(
|
||
|
data: object,
|
||
|
dynamicParams?: string | Array<string> | object,
|
||
|
defaultParams?: object,
|
||
|
): any {
|
||
|
let paramsObject = {};
|
||
|
if (isString(dynamicParams)) {
|
||
|
paramsObject = getParamsString(data, dynamicParams);
|
||
|
} else if (isArray(dynamicParams)) {
|
||
|
paramsObject = getParamsArray(data, dynamicParams);
|
||
|
} else if (isFunction(dynamicParams)) {
|
||
|
paramsObject = getParamsFunction(data, dynamicParams);
|
||
|
} else if (isObject(dynamicParams)) {
|
||
|
// Function is Object
|
||
|
paramsObject = getParamsObject(data, dynamicParams);
|
||
|
}
|
||
|
return { ...defaultParams, ...paramsObject };
|
||
|
}
|
||
|
|
||
|
function getParamsString(data: object, dynamicParams: string, key?: string): object {
|
||
|
if (dynamicParams.endsWith('[]')) {
|
||
|
dynamicParams = dynamicParams.split('[]')[0];
|
||
|
if ((data as any).list) {
|
||
|
return {
|
||
|
[key || dynamicParams]: (data as any).list.map((record: any) => {
|
||
|
return record[dynamicParams];
|
||
|
}),
|
||
|
};
|
||
|
} else {
|
||
|
return { [key || dynamicParams]: [get(data, dynamicParams)] }; //支持单条数据数组形式
|
||
|
}
|
||
|
}
|
||
|
if (dynamicParams.includes('[].')) {
|
||
|
const dp = dynamicParams.split('[].');
|
||
|
const list = getParamsString(data, dp[0])[dp[0]];
|
||
|
if (isArray(list)) {
|
||
|
const rd = list.reduce((prev, cur) => {
|
||
|
const _data = get(cur, dp[1]);
|
||
|
if (!isUndefined(_data)) {
|
||
|
prev.push(_data);
|
||
|
}
|
||
|
return prev;
|
||
|
}, []);
|
||
|
// console.log("rd.join(',')", { [key || dynamicParams]: rd.join(',') });
|
||
|
return { [key || dynamicParams]: rd.join(',') }; //支持单条数据数组形式
|
||
|
}
|
||
|
}
|
||
|
const value = get(data, dynamicParams);
|
||
|
if (!isUndefined(value)) {
|
||
|
return { [key || dynamicParams]: get(data, dynamicParams) };
|
||
|
}
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
function getParamsArray(data: object, dynamicParams: Array<string>): object {
|
||
|
return dynamicParams.reduce((prev, cur) => {
|
||
|
return Object.assign(prev, getParamsString(data, cur));
|
||
|
}, {});
|
||
|
}
|
||
|
|
||
|
function getParamsObject(data: object, dynamicParams: any): object {
|
||
|
return Object.keys(dynamicParams).reduce((prev, cur) => {
|
||
|
return Object.assign(prev, getParamsString(data, dynamicParams[cur], cur));
|
||
|
}, {});
|
||
|
}
|
||
|
|
||
|
function getParamsFunction(data: object, dynamicParams: Function): object {
|
||
|
return dynamicParams(data);
|
||
|
}
|
||
|
|
||
|
function hasArrayParams(dynamicParams: Record<string, any>): boolean {
|
||
|
return Object.keys(dynamicParams).some((key) => {
|
||
|
return dynamicParams[key].endsWith('[]');
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return { getParams, hasArrayParams };
|
||
|
}
|