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 true
和 false
但我想知道是否有更快或更优雅的方式来达到相同的目标。
还有,是的,祝大家有愉快的一天
您想要的结果是一个布尔值,但您当前使用的是 .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 一侧。否则,如果 isRequired
是 true
,我们检查条件的 right-hand 端以检查 obj.value
是否为假:!obj.value
.
在命题逻辑中,上述条件:
!obj.isRequired || !obj.value
在逻辑上等同于
!(obj.isRequired && obj.value)
(有关详细信息,请参阅 De Morgan's law),因此我们也可以将其用作我们的条件。您可以将其解释为:如果对象是必需的并且有值,则 return false
,否则 true
(如果不需要或没有值) .
请在下面找到有关对象迭代和查询的一般问题。
这是一个对象列表(旨在管理连接形式):
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
或 ""
true
和 false
但我想知道是否有更快或更优雅的方式来达到相同的目标。
还有,是的,祝大家有愉快的一天
您想要的结果是一个布尔值,但您当前使用的是 .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 一侧。否则,如果 isRequired
是 true
,我们检查条件的 right-hand 端以检查 obj.value
是否为假:!obj.value
.
在命题逻辑中,上述条件:
!obj.isRequired || !obj.value
在逻辑上等同于
!(obj.isRequired && obj.value)
(有关详细信息,请参阅 De Morgan's law),因此我们也可以将其用作我们的条件。您可以将其解释为:如果对象是必需的并且有值,则 return false
,否则 true
(如果不需要或没有值) .