奇怪的解构赋值,给出 undefined

Strange destructuring assignment, giving undefined


const apiConfig = JSON.parse(process.env.apiConfig);
const securityContextConfigurations = _.get(
  apiConfig,
  'agpAPIs',
  {});

/// what is going here?

const {
  securityContext : { apiKey, securityType }
} = securityContextConfigurations;

/// end what is going on here?
/// securityContext always comes back as undefined even though there is data in the securityContextConfigurations object

const securityContext = { apiKey, securityType };
const { serviceContext } = apiConfig;
serviceContext.refID = v5(serviceContext.refID, v1());
return Promise.resolve({ securityContext, serviceContext });

securityContextConfigurations 是一个对象,我要查找的键值对位于 securityContextConfigurations 对象中,但我的代码总是在我所在的特定 const 上失败我正在尝试为 securityContext

创建对象

我从来没有见过这样的模式,我想知道是否有办法简化它。

这是一种复杂的解构赋值形式

您可能熟悉这种更简单的类型。

const a={b:3, c:"hello"}

const {b, c} = a

console.log("b is ",b)
console.log("c is ",c)

这里他们只是做了一个额外的水平。

const securityContextConfigurations = {
  securityContext: {
    apiKey: "hello",
    securityType: "high"
  }
}

const {
  securityContext: {
    apiKey,   
    securityType
  }
} = securityContextConfigurations;

// The innermost items are extracted as variables

console.log("apiKey is", apiKey)
console.log("securityType is", securityType)
// However "securityContext" is not extracted as a variable

请记住,在 JS 中 {a, b} 是 shorthand for {a:a, b:b}。为了探究发生了什么,我们可以在“:”的两侧放置不同的变量名。

const securityContextConfigurations = {
  securityContext: {
    apiKey: "hello",
    securityType: "high"
  }
}

const {
  securityContext: {
    apiKey:x,   
    securityType:y
  }
} = securityContextConfigurations;

// The destination variable name on the *right hand side* of the ":". The variable name on the left of the ":" is only to tell JS which element of the source to extract.  

console.log("x is", x)
console.log("y is", y)

// apiKey, securityType and securityContext are not extracted as variabels. 

如果有什么安慰的话,我已经用 JS 编码十多年了,而且我以前也从未见过它。 8-)

程序员可能在做什么

出于他们最了解的原因,他们想提取较小的元素,然后将它们重新组装成更大的对象 securityContext

因此您突出显示的代码得到 apiKeysecurityType.

之后的行重建了一个包含这些元素的新对象securityContext

通常你我可能会直接得到securityContext,然后提取元素securityTypeapiKey

也许作者试图避免 获取 securityContext 除了这两个以外的任何其他部分?这就是为什么他们选择先提取它们,然后重新组装一个只有所需项目的新 securityContext

如何重写它以使其更易于理解

const apiKey = securityContextConfigurations.apiKey
const securityType = securityContextConfigurations.securityType
const securityContext = { apiKey, securityType };