当前位置: 首页 > 知识库问答 >
问题:

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

姬昊焱
2024-01-16

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

示例

const a = {  b: null}

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

a.b.c.d.e="hello";   // 如果没有判断,直接赋值报错

共有3个答案

訾渝
2024-01-16

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

汝岳
2024-01-16

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 {      }    },  });}
钱京
2024-01-16

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

  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

 类似资料:
  • 在传递嵌套的对象时,拿到的是字符串 '[object Object]', 而不是原始的对象. 除了使用 oops: (JSON.stringify(oops)) 还有更合适的方案传参吗?

  • 比如有对象 我只能按照顺序拿到数组['a', 'b', 'c', 'd', 'f'] 如果想给f赋值, 只能 如果想要写上面这个表达式的通用函数,要怎么写。

  • [ {"fields":{"itemname":"aaa","qty":100},"billno":"a001"}, {"fields":{"itemname":"bbb","qty":300},"billno":"a002"}, {"fields":{"itemname":"ccc","qty":200},"billno":"a004"}, {"fields":{"itemname":"eee"

  • 问题内容: 我有基于json的数据结构,其中包含嵌套对象。为了访问特定的数据元素,我一直将对对象属性的引用链接在一起。例如: 如果未定义b或bc,则将失败并显示错误。但是,我想获得一个值(如果存在的话),否则只是未定义。无需检查链中每个值是否存在的最佳方法是什么? 我想尽可能地保持这种方法,所以我不必添加大量的辅助方法,例如: 要么 我也想尝试避免使用try / catch构造,因为这不是错误,因

  • 问题内容: 这是为这篇文章准备的一个通用的虚构示例。考虑6节课 是外部类,假设它为数据库表保留一个对象。 在此,没有呼叫或或。我的目标是外部范围不需要的内部对象的示例。 是内取和操作的数据,因此需要,和。 包含和需要,和。 若要让事情变得有趣,它需要一个Logger。我的示例现在深了3个作用域。 **我的问题很简单,如果您有一个对象3(或更多)作用域,而外部作用域上的对象没有调用该对象,那么如何将

  • 我有一门java课 在上面的场景中,示例具有子示例,这又是示例列表。此嵌套可以是 n 级。我想实现的是有一个示例列表,即扁平化上面的对象并将所有示例收集到最终列表中(收集所有n级示例)。一个明显的方法是递归。在Java中有什么方法可以更有效地实现它。我尝试了一些java 8概念,但它们不符合要求。