如何让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 === truerole.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,如果你想将结果放入变量)。 .filterif 中不起作用,因为即使没有结果,空数组也是真实的。

如果你的数组有很多可能的键值,它们可以匹配,那么也许在扫描第二个数组之前首先收集第一个数组中找到的键值:

const keysA = new Set(arrayA.map(({partTime, key}) => partTime && key));
if (arrayB.some(({partTime, key}) => partTime && keysA.has(key))) {
  /* ... */
}

这假设 false 不是 key 的可能值。