如何检查对象上是否存在多个属性而不会太冗长?

awm*_*awm 8 javascript

我正在尝试以以下方式验证配置对象上是否存在某些属性并且在 javascript 中具有值(真实?不一定像评论中指出的那样):

const verifyJanrainAppSettings = (options) => {
    return options.JanrainAppSettings
      && options.JanrainAppSettings.settings.tokenUrl
      && options.JanrainAppSettings.settings.capture.clientId
      && options.JanrainAppSettings.settings.capture.appId
      && options.JanrainAppSettings.settings.capture.appDomain
      && options.JanrainAppSettings.settings.capture.captureServer
      && options.JanrainAppSettings.settings.httpLoadUrl
      && options.JanrainAppSettings.settings.httpsLoadUrl
}
Run Code Online (Sandbox Code Playgroud)

我觉得这太冗长了,我很好奇是否有更好的模式。也许像 if (['my', 'options'] in myObject) ...

T.J*_*der 7

您可以保留对 的引用settings,这会改善一些情况:

const verifyJanrainAppSettings = (options) => {
    const settings = options.JanrainAppSettings && options.JanrainAppSettings.settings;
    return settings &&
      settings.tokenUrl &&
      settings.capture && // ** This was missing in the question, but I think you need it
      settings.capture.clientId &&
      settings.capture.appId &&
      settings.capture.appDomain &&
      settings.capture.captureServer &&
      settings.httpLoadUrl &&
      settings.httpsLoadUrl;
};
Run Code Online (Sandbox Code Playgroud)

虽然您可以将其中一些名称放在数组中并使用循环,但我想我会保留它。

使用可选链接(ES2020 中的新功能),第一行可以是:

    const settings = options.JanrainAppSettings?.settings;
Run Code Online (Sandbox Code Playgroud)

数组版本看起来像:

const settingsProps = "capture tokenUrl httpLoadUrl httpsLoadUrl".split(" ");
const captureProps = "clientId appId appDomain captureServer".split(" ");
const verifyJanrainAppSettings = (options) => {
    const settings = options.JanrainAppSettings && options.JanrainAppSettings.settings;
    return settings &&
      settingsProps.every(prop => settings[prop]) &&
      captureProps.every(prop => settings.capture[prop]);
};
Run Code Online (Sandbox Code Playgroud)

adiga 问了个好问题。如果你想要存在而不是真实(你的问题中有真实性),你会想要in(或为了自己的财产检查, hasOwnProperty )。例如:

const settingsProps = "capture tokenUrl httpLoadUrl httpsLoadUrl".split(" ");
const captureProps = "clientId appId appDomain captureServer".split(" ");
const verifyJanrainAppSettings = (options) => {
    const settings = options.JanrainAppSettings && options.JanrainAppSettings.settings;
    return settings &&
      settingsProps.every(prop => prop in settings) &&
      captureProps.every(prop => prop in settings.capture);
};
Run Code Online (Sandbox Code Playgroud)