用JavaScript分解对象

时间:2018-10-02 11:11:32

标签: javascript node.js

在我的代码库中,我有一个对象:

let myObject = {
  "version": 1,
  "traceId": "123456789",
  "session": {},
  "trigger": {
    "service": "some_service_is_here",
    "action": "update",
    "resource": "transaction"
  },
  "changesets": [
    {
      "update": {
        "retryCount": 1
      },
      "conditions": {
        "equal": {
          "subscriptionId": "aaaaaaaaaaaa",
          "transactionId": "bbbbbbbbbbbb"
        }
      }
    },
    {
      "update": {
        "retryCount": 2
      },
      "conditions": {
        "equal": {
          "subscriptionId": "ccccccccccccc",
          "transactionId": "dddddddddddddd"
        }
      }
    }
  ]
}

我需要从该对象中提取一些属性。到目前为止,已使用Lodash完成。正在进行更多提取,但是它们是完全相同的。将其与Lodash结合使用的几个示例:

const trigger = _.get(myObject, 'trigger', null);
const retryCount = _.get(myObject, 'changesets[0].update.retryCount', null);

它的工作原理和行为符合预期。我想通过消除Lodash并开始使用Destructuring来改进此代码。

到目前为止,我有这个:

const trigger = _.get(myObject, 'trigger', null);

becomes

const {trigger} = myObject;

还有:

const retryCount = _.get(myObject, 'changesets[0].update.retryCount', null);

成为

const {changesets: [{update:{retryCount:retryCount = null}}]} = myObject;

它也可以工作,测试通过了:

现在我有几个问题:

  1. 这是提取这些值的正确做法吗?

  2. 就速度和代码可读性而言,这值得吗?

  3. 第二个销毁示例。我将收到一个changeset数组,其中包含许多对象(未知数量),但是我始终对第一个对象感兴趣。 lodash的例子说明了这一点。分解时,我不指定默认情况下需要第一个(从零开始)。我需要某种方式指定我需要第零个,还是默认行为?

1 个答案:

答案 0 :(得分:1)

  1. 是,但目前您的变体形式不相等。您需要将null指定为具有解构功能的变量的默认值。
  2. 代码不是更快。至于可读性-这取决于。
  3. 您当前正在通过列表中项目的位置显式指定索引。例如

    const {changesets: [,,{update}]} = myObject;
    

    将显式提取第3个元素。您无需执行任何其他操作。

PS retryCount:retryCount最好不要两次指定相同的名称。看起来很混乱。读者(像我一样)将重读几次,以找出差异。