mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-11 11:50:24 +08:00
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
/**
|
||
* 根据对象访问路径,获取对应的值
|
||
*
|
||
* @param obj 对象,如 {user: {name: 'xxx'}, orderNo: 1212211, products: [{id: 12}]}
|
||
* @param path 访问路径,如 orderNo 或者 user.name 或者product[0].id
|
||
* @returns 路径对应的值
|
||
*/
|
||
export function getValueByPath(obj: any, path: string) {
|
||
const keys = path.split('.');
|
||
let result = obj;
|
||
for (let key of keys) {
|
||
if (!result) {
|
||
return undefined;
|
||
}
|
||
// 如果是字符串,则尝试使用json解析
|
||
if (typeof result == 'string') {
|
||
try {
|
||
result = JSON.parse(result);
|
||
} catch (e) {
|
||
console.error(e);
|
||
return undefined;
|
||
}
|
||
}
|
||
if (typeof result !== 'object') {
|
||
return undefined;
|
||
}
|
||
|
||
if (key.includes('[') && key.includes(']')) {
|
||
// 处理包含数组索引的情况
|
||
const arrayKey = key.substring(0, key.indexOf('['));
|
||
const matchIndex = key.match(/\[(.*?)\]/);
|
||
|
||
if (!matchIndex) {
|
||
return undefined;
|
||
}
|
||
|
||
const index = parseInt(matchIndex[1]);
|
||
|
||
let arrValue = result[arrayKey];
|
||
if (typeof arrValue == 'string') {
|
||
try {
|
||
arrValue = JSON.parse(arrValue);
|
||
} catch (e) {
|
||
result = undefined;
|
||
break;
|
||
}
|
||
}
|
||
|
||
result = Array.isArray(arrValue) ? arrValue[index] : undefined;
|
||
} else {
|
||
result = result[key];
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|