嵌套对象中的默认字段值

时间:2017-07-05 20:48:27

标签: 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没有长度。

目前,我正在用

这样的东西填充缺少的字段
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来检索数据。

3 个答案:

答案 0 :(得分:2)

我建议使用某种解决方案来建立预先确定的模式,并继续省略空数组/值。然后你可以做类似

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

lodash.get(),其中defaultValue由您的架构确定为空字符串""0null等。

答案 1 :(得分:2)

从响应中删除空对象/数组不是一个好习惯,因为它们可以是有效值。

这是过早优化,对性能没有实际好处。作为回报,当您需要专门处理每个响应时,它会给您带来很多麻烦。

但如果您仍然认为值得,那么我建议使用lodash get功能。

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

答案 2 :(得分:0)

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

var _d = a.b.c.d || [].
// does something with _d.length

当您尝试做某事时,您可以实现这一目标,但代码质量会更差。认为不同,做不同可能会更好。

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