FE-Interview
FE-Interview copied to clipboard
Day49:请你完成一个safeGet函数,可以安全的获取无限多层次的数据
// 请你完成一个safeGet函数,可以安全的获取无限多层次的数据,一旦数据不存在不会报错,会返回 undefined,例如
var data = { a: { b: { c: 'yideng' } } }
safeGet(data, 'a.b.c') // => yideng
safeGet(data, 'a.b.c.d') // => undefined
safeGet(data, 'a.b.c.d.e.f.g') // => undefined
扫描下方二维码,获取答案以及详细解析,同时可解锁800+道前端面试题。

const safeGet = (o,path) => {
try {
return path.split('.').reduce((o,k) => o[k],o)
} catch (error) {
return undefined
}
}
var data = { a: { b: { c: 'yideng' } } };
safeGet(data, 'a.b.c') // => yideng
safeGet(data, 'a.b.c.d') // => undefined
safeGet(data, 'a.b.c.d.e.f.g') // => undefined
function safeGet(data,target){
console.log(eval("data."+target.replace(/\./g,'?.'))||undefined);
}
再给一种实现方式,使用最新的语法
const safeGet = (data, keyStr) => {
const keys = keyStr.split('.');
let currentData = data;
for (const key of keys) {
currentData = currentData?.[key];
}
return currentData;
}
// 参考答案 const safeGet = (o, path) => { try { return path.split('.').reduce((o, k) => o[k], o) } catch (e) { return undefined; } }
function safeGet(target, path) {
path = typeof path === "string" ? path.split('.') : path
let key = path.splice(0, 1)
if (path.length === 0 || target[key] === undefined) {
return target[key]
}
return safeGet(target[key], path)
}