feat: 工具函数getNestPrperty用于扁平化对象

This commit is contained in:
2025-10-23 06:26:33 +00:00
parent da1ece8e62
commit 134dad264b

44
src/helper/nest.ts Normal file
View File

@ -0,0 +1,44 @@
/**
* 获取 obj 中路径 path 对应的值。
* 支持路径中的数组:如果在前一层得到数组,则对该数组中每个元素进一步取值。
* @param obj 任意对象或数组
* @param path 点分隔路径(例如 "a.b.c" 或 "translations.name"
* @returns 如果结果仅一个值,返回该值;如果多个,返回值数组;如果无值,返回 undefined。
*
* ---
* @example
* const data = {
* translations: [
* { languages_code: 'zh-CN', name: '中文' },
* { languages_code: 'en-US', name: 'English' }
* ]
* };
*
* getNestedProperty(data, 'translations.name');
* // 返回 ['中文', 'English']
*/
export function getNestedProperty<T>(obj: unknown, path: string): T | T[] | undefined {
const parts = path.split('.');
function dive(current: unknown, index: number): unknown {
if (current == null) return undefined;
if (index >= parts.length) return current;
const key = parts[index];
if (!key) return undefined;
if (Array.isArray(current)) {
return current.map((item) => dive(item, index));
}
if (typeof current === 'object') {
const value = (current as Record<string, unknown>)[key];
return dive(value, index + 1);
}
return undefined;
}
const result = dive(obj, 0);
return result as T | T[] | undefined;
}