FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

Day49:请你完成一个safeGet函数,可以安全的获取无限多层次的数据

Open lgwebdream opened this issue 4 years ago • 6 comments

// 请你完成一个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

lgwebdream avatar Jul 06 '20 14:07 lgwebdream

扫描下方二维码,获取答案以及详细解析,同时可解锁800+道前端面试题。

lgwebdream avatar Jul 06 '20 14:07 lgwebdream

const safeGet = (o,path) => { try { return path.split('.').reduce((o,k) => o[k],o) } catch (error) { return undefined
} }

Web3TomCat avatar Feb 03 '21 23:02 Web3TomCat

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

jinzhe avatar May 14 '21 04:05 jinzhe

再给一种实现方式,使用最新的语法

const safeGet = (data, keyStr) => {
  const keys = keyStr.split('.');
  let currentData = data;
  for (const key of keys) {
    currentData = currentData?.[key];
  }
  return currentData;
}

wind8866 avatar Jul 05 '21 04:07 wind8866

// 参考答案 const safeGet = (o, path) => { try { return path.split('.').reduce((o, k) => o[k], o) } catch (e) { return undefined; } }

LiSiQinF avatar Aug 11 '21 10:08 LiSiQinF

    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)
    }

lang711 avatar Aug 28 '22 03:08 lang711