Javascript 嵌套对象中的默认字段值

Javascript 嵌套对象中的默认字段值,javascript,json,ecmascript-6,Javascript,Json,Ecmascript 6,我正在尝试从JSON创建一个对象 我的物体的一部分看起来像 a: { name: "A name", b: { c: { d: [] } } } 为了节省带宽,空数组和空对象从JSON中剥离,因此我接收的JSON是 { "a": { "name": "A name" }} 如果我只是将JSON转换为一个对象,那么当我尝试执行a.b.c.d.length之类的操作时,就会出现错误,因为undefined没有长度 目前

我正在尝试从JSON创建一个对象

我的物体的一部分看起来像

a: {
   name: "A name",
   b: {
      c: {
         d: []
         }
      }
   }
为了节省带宽,空数组和空对象从JSON中剥离,因此我接收的JSON是

{ "a": { "name": "A name" }}
如果我只是将JSON转换为一个对象,那么当我尝试执行
a.b.c.d.length
之类的操作时,就会出现错误,因为
undefined
没有长度

目前,我正在填充缺少的字段,例如

const json = getJson();
const obj = {
    ...json,
    a: {
       ...json.a,
       b: {
          ...json.a.b,
          c: {
             ...json.a.b.c,
             d: json.a.b.c.d || []
             }
           }
        }
     };
这是相当冗长的,当有几个字段需要默认值时,它会变得更加丑陋

一个明显的解决方案是不从传输的JSON中去掉空数组。假设这是不可能的,有没有更好的方法来处理这个案件

在实际情况中,每个级别都有多个字段,因此所有的扩展运算符都是必需的。(即使它们不是,我也希望将它们包括在内,因为未来结构可能会增长。)


编辑:我没有使用JQuery。我使用whatwgfetch来检索数据。

为了获得最佳实践,我认为您不应该使用复杂的方法或语法。 只需使用Javascript的通用默认值集:

var _d = a.b.c.d || [].
// does something with _d.length
当您试图做一些事情时,您可以做到这一点,但代码质量更差。不同的想法和做不同的事情可能会更好


此外,我认为使用所有属性显式声明原始对象比像您这样删除空属性要好。

对于最佳实践,我认为您不应该使用复杂的方法或语法。 只需使用Javascript的通用默认值集:

var _d = a.b.c.d || [].
// does something with _d.length
当您试图做一些事情时,您可以做到这一点,但代码质量更差。不同的想法和做不同的事情可能会更好


此外,我认为使用所有属性显式声明原始对象比像您这样删除空属性要好。

我建议某种解决方案,其中您可以建立一个预先确定的模式,并继续省略空数组/值。然后你可以做类似的事情

_.get(object, 'property.path.here', defaultValue)

使用,其中,
defaultValue
由您的模式确定为空字符串
0
null
,等等。

我建议某种解决方案,其中您建立一个预先确定的模式,并继续忽略空数组/值。然后你可以做类似的事情

_.get(object, 'property.path.here', defaultValue)

在中,模式将
defaultValue
确定为空字符串
0
null
,等等。

从响应中删除空对象/数组不是一个好的做法,因为它们可能是有效的值

这是过早的优化,对性能没有真正的好处。作为回报,当你需要特别处理每个响应时,它会给你带来很多麻烦

但如果您仍然认为它值得,那么我建议使用lodash
get
函数

_.get(object, 'property.path.here')

从响应中删除空对象/数组不是一个好的做法,因为它们可能是有效值

这是过早的优化,对性能没有真正的好处。作为回报,当你需要特别处理每个响应时,它会给你带来很多麻烦

但如果您仍然认为它值得,那么我建议使用lodash
get
函数

_.get(object, 'property.path.here')

要明确的是,这不是ES6/2015,这是一个@dama,我认为它不会像您认为的那样实现细粒度控制。有了
$.extend({a:{b:{c:'hello'}}},{a:{d:{e:'debye'}}}})
,asker希望
{a:{b:{c:'hello'},d:{e:'debye'}}
,但实际上只是得到了
{a:{d:{e:'debye''debye'}}}
编辑我的错误,忘记了可选的第一个参数
deep
。这将起作用:
$.extend(true,{a:{b:{c:'hello'}},{a:{d:{e:'debye'}}}}})
很清楚,这不是ES6/2015,这是一个@dama,我不认为它可以实现您认为的细粒度控制。有了
$.extend({a:{b:{c:'hello'}}},{a:{d:{e:'debye'}}}})
,asker希望
{a:{b:{c:'hello'},d:{e:'debye'}}
,但实际上只是得到了
{a:{d:{e:'debye''debye'}}}
编辑我的错误,忘记了可选的第一个参数
deep
。这是可行的:
$.extend(是的,{a:{b:{c:'hello'}},{a:{d:{e:'debye'}}}})
我大体上同意避免“过于复杂”的方法,但我认为将asker的“带宽节省”技术与那些糟糕的实践混为一谈是错误的。我认为,如果JSON像他说的那样大,那么从长远来看,省略空对象和数组将节省大量资源,只要它们为默认值建立某种模式。是的,这取决于具体情况。我只是打开了另一种方法,而不是坚持遵循一种方法。我大体上同意避免“过于复杂”的方法,但我认为将询问者的“节省带宽”技术与这些不良做法混为一谈是错误的。我认为,如果JSON像他说的那样大,那么从长远来看,省略空对象和数组将节省大量资源,只要它们为默认值建立某种模式。是的,这取决于具体情况。我只是打开另一个方法,而不是坚持走一条路。