如何优雅的取多级嵌套的对象值?

有一个对象

a:{
    b:{
        c:{
        ....
        }
    }
}

要取值

let val = a.b.c.d.e.f;

必须判断前面几级是否存在,否则执行时会报错。所以一般要写成这样

if (a && a.b && a.b.c && a.b.c.d && a.b.c.e) {
    let val = a.b.c.d.e.f;
}

有无优雅的写法或node包可以解决?

阅读 10.4k
5 个回答

lodash的 get

_.get(object, path, [defaultValue])

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

_.get(object, ['a', '0', 'b', 'c']);
// => 3

_.get(object, 'a.b.c', 'default');
// => 'default'

说下个人看法。
首先超过3级(包括3级)的嵌套不应该太多,如果有,首先看看是不是设计上除了问题。其次,如果遇到了,那么

必须判断前面几级是否存在

这个是没有必要的,报错才是正常的,提醒你哪里写漏或写错,改掉就好了,即使是在插件或者框架中,也是对个别比较重要的参数进行验证,否则调用一方很难判断错误源。参数验证大多不会是这种地方(提示xxx是undeifed或者null,xxx() is not a function这种),一般的异常提示(error),旨在明确一个复杂逻辑或亦混淆逻辑的错误源。

if (a.b.c.d.e.f != undefined){
    // do something
}

判断最后一级的数据是正确不就可以了么?

    //如果a.b.c.d.e存在的话,执行下面代码
    if (!!a.b.c.d.e){
        // do something
    }
新手上路,请多包涵
// 类似的方法不可以,如果中间有一个是 undefined
// 就会报 Cannot read property 'XXX' of undefined 的错误
if (a.b.c.d.e.f != undefined){
    // do something
}

我目前在用的方法很简单,不需要引入任何包:

try {
  let val = a.b.c.d.e.f
  console.log(val)
} catch {
  // a.b.c.d.e.f 不存在
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏