get
2024年06月17日
一、认识
问题: 请实现一个函数, 通过一个路径, 获取对象属性
场景: 在 JavaScript
中经常会出现嵌套调用这种情况,如 a.b.c.d.e
,但是这么写很容易抛出异常。你需要这么写 a && a.b && a.b.c && a.b.c.d && a.b.c.d.e
,但是显得有些啰嗦与冗长了。特别是在 graphql
中,这种嵌套调用更是难以避免。
二、语法
三、实现
3.1 Bolawen reduce
function get(object, path, defaultValue) {
const pathRegExp = /[,\[\].]+?/;
const keys = Array.isArray(path)
? path
: path.split(pathRegExp).filter(Boolean);
return keys.reduce((value, key) => {
if (
value &&
typeof value === "object" &&
Object.prototype.hasOwnProperty.call(value, key)
) {
return value[key];
} else {
return defaultValue;
}
}, object);
}
测试代码
const object = { a: [{ b: { c: 3 } }] };
console.log(get(object, "a[0].b.c"));
console.log(get(object, ["a", "0", "b", "c"]));
console.log(get(object, "a.b.c", "default"));
3.2 Bolawen for……of
function get(object, path, defaultValue) {
const pathRegExp = /[,\[\].]+?/;
const keys = Array.isArray(path)
? path
: path.split(pathRegExp).filter(Boolean);
for (const key of keys) {
if (
object &&
typeof object === "object" &&
Object.hasOwnProperty.call(object, key)
) {
object = object[key];
} else {
return defaultValue;
}
}
return object;
}
测试代码
const object = { a: [{ b: { c: 3 } }] };
console.log(get(object, "a[0].b.c"));
console.log(get(object, ["a", "0", "b", "c"]));
console.log(get(object, "a.b.c", "default"));