如何将点表示法转为括号语法,程序化访问嵌套对象属性?
如何将点表示法的属性路径转换为括号语法访问嵌套对象属性
你需要实现一个函数,接收类似'person.fullName'的点分隔路径字符串,通过括号语法逐层访问嵌套对象的属性值。原代码里有两个明显问题:一是正则匹配.的时候没转义,.在正则里是通配符,会匹配任意字符;二是拆分路径后没有实际执行属性访问逻辑。
下面是修正后的实现,同时加入了属性不存在时的容错处理:
const data = { firstName: 'Jane Doe', lastName: 'Doe', person: { fullName: 'Jane Doe' } } function outputValue(path) { console.log('path passed:', path) // 用转义的点判断是否为嵌套路径 const isNested = /\./.test(path) let value = data if (isNested) { const nestedPath = path.split('.') // 逐层遍历路径,用括号语法访问属性 for (const key of nestedPath) { // 容错:如果当前层级无该属性,终止遍历并返回undefined if (!value || !(key in value)) { value = undefined break } value = value[key] } } else { // 非嵌套路径直接用括号访问 value = data[path] } console.log('value:', value) console.log('--------------------------------') } outputValue('firstName') outputValue('person.fullName') outputValue('person.nonExistent') // 测试不存在的属性
TypeScript 版本优化
如果用TypeScript,可以给函数加上泛型和类型约束,让路径更安全(比如限制路径为对象的有效属性路径),同时完善类型提示:
type Path<T> = T extends object ? { [K in keyof T]: `${K}` | `${K}.${Path<T[K]>}` }[keyof T] : never; const data = { firstName: 'Jane Doe', lastName: 'Doe', person: { fullName: 'Jane Doe' } } satisfies Record<string, any>; function outputValue<T extends typeof data, P extends Path<T>>(path: P) { console.log('path passed:', path) let value: any = data const nestedPath = path.split('.') for (const key of nestedPath) { if (!value || !(key in value)) { value = undefined break } value = value[key] } console.log('value:', value) console.log('--------------------------------') } outputValue('firstName') outputValue('person.fullName') // outputValue('person.invalid') // TypeScript会报错,提示路径无效
核心逻辑说明
- 用
/\./正则判断路径是否包含嵌套层级,避免原代码中.匹配任意字符的问题 - 将路径按
.拆分成数组后,通过循环逐层用value[key](括号语法)访问对象属性 - 加入容错判断,防止访问不存在的属性导致报错
- TypeScript版本通过递归类型
Path<T>生成对象的所有有效点分隔路径,提供编译时类型检查
内容的提问来源于stack exchange,提问作者uber_n00b
相关产品推荐
相关产品推荐

