#99 safeGet


  • 0
    administrators

    有时候我们需要访问一个对象较深的层次,但是如果这个对象某个属性不存在的话就会报错,例如:

    var data = { a: { b: { c: 'ScriptOJ' } } }
    data.a.b.c // => scriptoj
    data.a.b.c.d // => 报错,代码停止执行
    console.log('ScriptOJ') // => 不会被执行
    

    请你完成一个 safeGet 函数,可以安全的获取无限多层次的数据,一旦数据不存在不会报错,会返回 undefined,例如:

    var data = { a: { b: { c: 'ScriptOJ' } } }
    safeGet(data, 'a.b.c') // => scriptoj
    safeGet(data, 'a.b.c.d') // => 返回 undefined
    safeGet(data, 'a.b.c.d.e.f.g') // => 返回 undefined
    console.log('ScriptOJ') // => 打印 ScriptOJ
    

  • 0

    const safeGet = (obj, str) => {
    /* TODO */
    if (str.indexOf('.') >= 0) {
    let arr = str.split('.');
    let myobj = obj;
    for (let i = 0; i < arr.length; i++) {
    if (myobj[arr[i]]) {
    myobj = myobj[arr[i]];
    if (i == (arr.length - 1)) {
    return myobj;
    }
    } else {
    return undefined;
    }
    }
    } else {
    return obj[str];
    }
    }


  • 0

    const safeGet = (data, path) => {
        if (!path) return undefined
        let paths = path.split('.')
        let res = data
        while (paths.length) {
            res = res[paths.shift()]
            if (!res) return undefined
        }
        return res
    }

  • 0

    console.log(safeGate({"q":{"w":{"e":{"r":{"t":{"y":{"u":{"i":{"o":{"p":{"a":{"s":{"d":{"f":{"g":{"h":{"j":{"k":{"l":{"z":"ScriptOJ"}}}}}}}}}}}}}}}}}}}}, 'q.w.e.r.t.y.u.i.o.p.a.s.d.f'))
    
    输出{ g: { h: { j: [Object] } } }
    

    和答案不一致,怎么回事?


  • 0

    const safeGet = (data, path) => {
      let pathArr = path.split('.');
      let temp = data;
      for(let i of pathArr) {
        if(temp[i]) {
          temp = temp[i]
        } else {
          return undefined;
        }
      }
      return temp;
    }
    

  • 0

    const safeGet = (data, path) => {
    /* TODO */
    try{
    eval('data.'+path)
    }catch(error){
    return undefined
    }
    return eval('data.'+path)
    }
    这样不行么?????


  • 0

    const safeGet = (data, path) => {
    			if(!path) return undefined;
    			var arr = path.split(".");
    			try{
    				while(arr.length){
    					data =  data[arr.shift()];
    				}
    			}catch(err){
    				return undefined;
    			}
    			return data;
    		}
    

  • 1

    const safeGet = (data, path) => {
      return path.split('.').reduce((d,i)=>{
        return typeof d == 'undefined' ? d : d[i];
      },data);
    }
    

  • 0

    const safeGet = (data, path) => {
      try{
        return eval('data.'+path);
      }catch(e){return undefined}
    }
    

登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待