在JavaScript中,我有以下形式的对象:
const obj = {
foo: {},
bar: {},
baz: {}
};
该对象必须符合以下规则:
foo
。bar
和baz
都是可选的。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.);
}
}
是否有更好的方法来解决这个问题?
答案 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