跳到主要内容

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"));