在我的代码库中我有一个对象:
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 并开始使用解构来改进这段代码。
到目前为止我有这个:
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;
它也有效,测试通过:
现在我有几个问题:
这是提取这些值的正确做法吗?
就速度和代码可读性而言,这样做是否值得?
第二个解构示例。我将收到一个变更集数组,它有很多对象(未知数量),但我总是对第一个感兴趣。 lodash 示例说明了这一点。当我解构时,我没有指定我需要第一个(从零开始)它默认出现。我需要以某种方式指定我需要第零个,还是默认行为?
最佳答案
- 是的,但目前您的变体不相等。您需要将
null
指定为 destructuring 变体中的默认值。 - 代码并不快。至于可读性 - 这取决于。
您当前根据项目在列表中的位置明确指定索引。例如
const {changesets: [,,{update}]} = myObject;
将显式提取第三个元素。您不需要做任何额外的事情。
PS retryCount:retryCount
最好不要指定相同的名称两次。看起来很困惑。读者(比如我)会重读数遍,试图找出差异。
关于javascript - 在 Javascript 中解构对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52607177/