如何优雅地给多层嵌套的对象赋值?

假设有个对象非常多层,要给某一层进行赋值,那么需要一层层判断是否为空,有没有优雅的写法?

示例

const a = {
  b: null
}

此时要给a对象的d属性赋值,就需要一层层判断非空才行...

a.b.c.d.e="hello";   // 如果没有判断,直接赋值报错
阅读 2.3k
4 个回答

根据不同的场景,常用的有两种方案

  1. 如果单纯判断属性存在才能赋值,可以用楼上提供的 可选链 这种方案

    if (a?.b?.c?.d?.e) {
     a.b.c.d.e="hello";
    }
  2. 如果不存在的情况也要创建并赋值,可以用 lodashset 函数

    import _ from 'lodash-es';
    
    _.set(a, 'b.c.d.e', 'hello')

    https://www.lodashjs.com/docs/lodash.set#_setobject-path-value
    image.png

Proxy

function factory(obj) {
  return new Proxy(obj, {
    get(target, prop) {
      if (target.hasOwnProperty(prop) && typeof target[prop] === "object") {
        return factory(target[prop]);
      } else {
        return factory({});
      }
    },
    set(target, prop, value) {
      if (target.hasOwnProperty(prop)) {
        Reflect.set(...arguments);
      } else {
      }
    },
  });
}

lodash.get
lodash.has
lodahs.set

if(a?.b?.c?.d?.e) a.b.c.d.e="hello"

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏