实现思路
- 利用闭包封装递归函数,在外部定义一个函数,在该函数内部返回真正的递归函数,这样可以避免全局变量污染。
- 递归函数接收对象和键名路径数组作为参数。
- 在递归函数中,首先检查路径数组是否为空,如果为空则返回对象本身。
- 取出路径数组的第一个键名,检查对象是否存在该键名且该键值为对象,若满足则递归调用函数处理剩余路径,否则返回
undefined
。
代码实现
function createGetter() {
function getValueByPath(obj, path) {
if (path.length === 0) {
return obj;
}
const key = path[0];
if (obj && typeof obj === 'object' && key in obj) {
return getValueByPath(obj[key], path.slice(1));
}
return undefined;
}
return getValueByPath;
}
// 使用示例
const getter = createGetter();
const obj = { a: { b: { c: { d: 1 } } } };
const path = ['a', 'b', 'c', 'd'];
console.log(getter(obj, path));