在js中经常会出现嵌套调用这种情况,如a.b.c.d.e,但是这么写很容易抛出异常,你需要这么写 a&&a.b&&a.b.c&&a.b.c.d&&a.b.c.d.e但是显得有些啰嗦与冗长了。特别是在graphql中,这种嵌套调用更是难以避免。这里就需要一个get函数,使用get(a, ‘b.c.d.e’)简单清晰,并且容错性提高了很多。
- 代码实现
function get(source, path, defaultValue=undefined){
const paths = path.replace(/\[(\d+)\]/g,".$1").split(".")
let result = source
for(const p of paths) {
result = Object(result)[p];
if(result == undefined){
return undefined
}
}
return result;
}
console.log(get({a: null}, "a.b.c", 3))
console.log(get({a: undefined}, "a", 3))
console.log(get({a: null}, "a", 3))
console.log(get({a: [{b: 1}]}, "a[0].b", 3))
- 代码实现不考虑数组的情况
const _get = (object, keys, val) => {
return keys.split(/\./).reduce(
(o, j) => ((o || {})[j]), object
) || val
}