Javascript 对象:检查对象数组中值等于的每个对象

Javascript Object : check every object in array of object where value equal to

请在下面找到有关对象迭代和查询的一般问题。

这是一个对象列表(旨在管理连接形式):

const connexionData = {
  mail: {
    value: false,
    isRequired: true
  },
  password: {
    value: false,
    isRequired: true
  },
  name: {
    value: false,
    isRequired: false
  },
}

这是一个数组变量,它存储了来自 connexionData 的所有对象 const fieldstocheck = [connexionData.mail, connexionData.password, connexionData.name]

而下面函数 check 的目的是检查是否:

对于 fieldstocheck 中的每个对象,其中 isRequired 为真,如果 value 为假,则 return 为真,否则,return 为假

const check = () => {
  if((fieldstocheck.filter(key => 
    key.isRequired).every(val => 
        !val.value))) {
            return true
  } else {
    return false
  }
}

这个函数可以完成一般的工作。对于当前对象值,如果 values 更改为 true""

,则 returns truefalse

但我想知道是否有更快或更优雅的方式来达到相同的目标。

还有,是的,祝大家有愉快的一天

您想要的结果是一个布尔值,但您当前使用的是 .filter(),它创建了一个中间数组。您可以删除 .filter() 并直接在 fieldstocheck 数组上调用 .every() 以避免在内存中创建新数组。删除过滤器也会减少迭代次数,因为您只迭代数组一次:

const connexionData = { mail: { value: false, isRequired: true }, password: { value: false, isRequired: true }, name: { value: false, isRequired: false }, }

const fieldstocheck = [connexionData.mail, connexionData.password, connexionData.name];

const res = fieldstocheck.every((obj) => !obj.isRequired || !obj.value);
console.log(res);

在上面,我们首先检查isRequired是否是false!obj.isRequired。如果它是 false.every() 回调方法 returns true 该对象(因为我们正在否定 ! isRequired)。当 || 的第一个操作数为真时,|| short-ciruits 所以我们不用担心检查 || 的 right-hand 一侧。否则,如果 isRequiredtrue,我们检查条件的 right-hand 端以检查 obj.value 是否为假:!obj.value.

在命题逻辑中,上述条件:

!obj.isRequired || !obj.value

在逻辑上等同于

!(obj.isRequired && obj.value)

(有关详细信息,请参阅 De Morgan's law),因此我们也可以将其用作我们的条件。您可以将其解释为:如果对象是必需的并且有值,则 return false,否则 true(如果不需要或没有值) .