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

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 };
}