Javascript 嵌套对象中的默认字段值
我正在尝试从JSON创建一个对象 我的物体的一部分看起来像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没有长度 目前
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
,等等。从响应中删除空对象/数组不是一个好的做法,因为它们可能是有效的值
这是过早的优化,对性能没有真正的好处。作为回报,当你需要特别处理每个响应时,它会给你带来很多麻烦
但如果您仍然认为它值得,那么我建议使用lodashget
函数
_.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像他说的那样大,那么从长远来看,省略空对象和数组将节省大量资源,只要它们为默认值建立某种模式。是的,这取决于具体情况。我只是打开另一个方法,而不是坚持走一条路。