<script>
const getAttribute = (object, path, defaultValue) => {
// 将路径字符串按点号分割成数组
const parts = path.split(".");
// 定义一个递归函数,用于逐步访问对象的属性
function getNestedObjectValue(obj, parts) {
// 如果没有更多的属性需要访问,返回当前对象
if (parts.length === 0) {
return obj;
}
// 取出第一个属性名
const first = parts.shift();
// 检查对象是否有该属性,并且属性值是对象或数组
if (obj && obj.hasOwnProperty(first)) {
// 如果是数组并且第一个属性是数字索引,直接访问
if (Array.isArray(obj) && !isNaN(first)) {
return getNestedObjectValue(obj[first], parts);
}
// 如果是对象,递归访问剩余的属性
if (typeof obj[first] === "object") {
return getNestedObjectValue(obj[first], parts);
}
// 如果不是对象或数组,直接返回属性值
return obj[first];
}
// 如果对象没有这个属性或属性值不是对象/数组,返回默认值
return defaultValue;
}
// 调用递归函数并返回结果
return getNestedObjectValue(object, parts);
};
// 测试代码
const obj = { a: { b: { c: 100 } }, d: [{ f: "abc" }] };
console.log(getAttribute(obj, "a.b.c", 0)) === 100; // true
console.log(getAttribute(obj, "a.b.e", "default")) === "default"; // true
console.log(getAttribute(obj, "d.0.f")) === "abc"; // true
</script>
【递归 】
于 2024-06-12 10:05:12 首次发布