检查多个属性是否全部存在或全部丢失

时间:2018-07-29 07:03:40

标签: javascript

在JavaScript中,我有以下形式的对象:

const obj = {
  foo: {},
  bar: {},
  baz: {}
};

该对象必须符合以下规则:

  • 必须提供属性foo
  • 属性barbaz都是可选的。
  • 如果给出了bar,那么还必须给出baz

检查foo非常容易:

if (!obj.foo) {
  throw new Error('Foo is missing.');
}

如何以一种优雅的方式检查其他属性?我当然可以做一些事情,例如:

if ((obj.bar && !obj.baz) || (!obj.bar && obj.baz)) {
  throw new Error('Bar or baz is missing.');
}

但这无法很好地扩展。如果我不必检查两个属性,而是20个,要么都必须存在,要么都不检查?怎么办?

理想情况下,我什至希望错误消息准确指定缺少的那个(如果报告第一个,就足够了。)

我已经想到了这一点(这实际上意味着:如果至少给出了一个可选选项,请检查是否缺少其中任何一个):

if (obj.bar || obj.baz) {
  if (!obj.bar) {
    throw new Error('Var is missing.);
  }
  if (!obj.baz) {
    throw new Error('Baz is missing.);
  }
}

是否有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

一个选择是将需要在一起的所有属性组成一个数组,然后在其上使用pycurl.error: (1, 'Protocol "tcp" not supported or disabled in libcurl')以获取找到的属性的数量。如果结果为0或数组的长度,则有效,否则无效。

reduce

或者,对于缺少属性的错误消息,可以改成const together = ['bar', 'baz', 'buzz']; const validate = obj => { if (!obj.foo) return false; const togPropCount = together.reduce((a, prop) => a + (prop in obj), 0); return togPropCount === 0 || togPropCount === together.length; }; console.log(validate({ foo: {}, bar: {}, baz: {} })); console.log(validate({ foo: {}, bar: {}, baz: {}, buzz: {} }));

filter