我正在尝试从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。我正在使用whatwg-fetch来检索数据。
答案 0 :(得分:2)
我建议使用某种解决方案来建立预先确定的模式,并继续省略空数组/值。然后你可以做类似
的事情_.get(object, 'property.path.here', defaultValue)
lodash.get()
,其中defaultValue
由您的架构确定为空字符串""
,0
,null
等。
答案 1 :(得分:2)
从响应中删除空对象/数组不是一个好习惯,因为它们可以是有效值。
这是过早优化,对性能没有实际好处。作为回报,当您需要专门处理每个响应时,它会给您带来很多麻烦。
但如果您仍然认为值得,那么我建议使用lodash get
功能。
_.get(object, 'property.path.here')
答案 2 :(得分:0)
对于最佳实践,我认为您不应该使用复杂的方法或语法。 只需使用Javascript的常见默认值集:
var _d = a.b.c.d || [].
// does something with _d.length
当您尝试做某事时,您可以实现这一目标,但代码质量会更差。认为不同,做不同可能会更好。
此外,我认为使用所有属性显式声明原始对象比删除空属性更好。