gpt4 book ai didi

javascript - 检查多个属性是否全部存在或全部缺失

转载 作者:行者123 更新时间:2023-11-28 17:26:05 24 4
gpt4 key购买 nike

在 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 个属性,或者全部都必须存在,或者都不存在,该怎么办?

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

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

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

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

最佳答案

一种选择是创建一个需要全部放在一起的属性的数组,然后对其使用 reduce 来获取找到的属性的数量。如果结果为0或数组的长度,则有效,否则无效。

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 代替:

const together = ['bar', 'baz', 'buzz'];
const validate = obj => {
if (!obj.foo) return false;
const missingProps = together.filter(prop => !(prop in obj));
return (missingProps.length === 0 || missingProps.length === together.length)
? true
: 'missing ' + missingProps.join(', ');
};
console.log(validate({
foo: {},
bar: {},
baz: {}
}));
console.log(validate({
foo: {},
bar: {},
baz: {},
buzz: {}
}));

关于javascript - 检查多个属性是否全部存在或全部缺失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51578042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com