如何让javascript比较更简洁?
How to make a javascript comparison more concise?
考虑以下两个 javascript 对象:
对象 A:
{
specialPropertyA: string,
partTime: boolean,
role: { key: string, label: string }
}
对象 B:
{
specialPropertyB: string,
partTime: boolean,
role: { key: number, label: string }
}
现在,考虑 arrayA: ObjectA[]
和 arrayB: ObjectB[]
。
我正在寻找一种简洁的方法来确定:
如果任何 ObjectA 具有 partTime === true
和 role.key === 1
,是否有满足相同要求的任何 ObjectB?我想检查 role.key === 2
.
的相同内容
我知道我可以这样做:
if(
arrayA.filter(objectA => objectA.partTime === true && objectA.role.key === 1)
&& arrayB.filter(objectB => objectB.partTime === true && objectB.role.key === 1)
|| arrayA.filter(objectA => objectA.partTime === true && objectA.role.key === 2)
&& arrayB.filter(objectB => objectB.partTime === true && objectB.role.key === 2)
)
但我根本不喜欢这个解决方案,尤其是因为我正在为键 2 重复相同的代码。关于如何使这个更简洁有什么建议吗?
一种方法是创建一个 higher-order 函数,您可以传递要查找的密钥编号。
此外,因为 partTime
是布尔值,所以 obj.partTime === true
简化为 obj.partTime
。
const makeCb = keyNum => obj => obj.partTime && obj.role.key === keyNum;
if (
(arrayA.some(makeCb(1)) && arrayB.some(makeCb(1))) ||
(arrayA.some(makeCb(2)) && arrayB.some(makeCb(2)))
) {
你需要 .some
(或者 .find
,如果你想将结果放入变量)。 .filter
在 if
中不起作用,因为即使没有结果,空数组也是真实的。
如果你的数组有很多可能的键值,它们可以匹配,那么也许在扫描第二个数组之前首先收集第一个数组中找到的键值:
const keysA = new Set(arrayA.map(({partTime, key}) => partTime && key));
if (arrayB.some(({partTime, key}) => partTime && keysA.has(key))) {
/* ... */
}
这假设 false
不是 key
的可能值。
考虑以下两个 javascript 对象:
对象 A:
{
specialPropertyA: string,
partTime: boolean,
role: { key: string, label: string }
}
对象 B:
{
specialPropertyB: string,
partTime: boolean,
role: { key: number, label: string }
}
现在,考虑 arrayA: ObjectA[]
和 arrayB: ObjectB[]
。
我正在寻找一种简洁的方法来确定:
如果任何 ObjectA 具有 partTime === true
和 role.key === 1
,是否有满足相同要求的任何 ObjectB?我想检查 role.key === 2
.
我知道我可以这样做:
if(
arrayA.filter(objectA => objectA.partTime === true && objectA.role.key === 1)
&& arrayB.filter(objectB => objectB.partTime === true && objectB.role.key === 1)
|| arrayA.filter(objectA => objectA.partTime === true && objectA.role.key === 2)
&& arrayB.filter(objectB => objectB.partTime === true && objectB.role.key === 2)
)
但我根本不喜欢这个解决方案,尤其是因为我正在为键 2 重复相同的代码。关于如何使这个更简洁有什么建议吗?
一种方法是创建一个 higher-order 函数,您可以传递要查找的密钥编号。
此外,因为 partTime
是布尔值,所以 obj.partTime === true
简化为 obj.partTime
。
const makeCb = keyNum => obj => obj.partTime && obj.role.key === keyNum;
if (
(arrayA.some(makeCb(1)) && arrayB.some(makeCb(1))) ||
(arrayA.some(makeCb(2)) && arrayB.some(makeCb(2)))
) {
你需要 .some
(或者 .find
,如果你想将结果放入变量)。 .filter
在 if
中不起作用,因为即使没有结果,空数组也是真实的。
如果你的数组有很多可能的键值,它们可以匹配,那么也许在扫描第二个数组之前首先收集第一个数组中找到的键值:
const keysA = new Set(arrayA.map(({partTime, key}) => partTime && key));
if (arrayB.some(({partTime, key}) => partTime && keysA.has(key))) {
/* ... */
}
这假设 false
不是 key
的可能值。