如何在JavaScript中检查一个数组是否是另一个数组的超集?

超集是指包含另一个集合的所有元素,可能还包含更多元素。了解如何检查一个数组是否是另一个数组的超集可能会偶尔派上用场。

由于数学定义中涉及到集合,重复的值不被考虑。这就是为什么使用Set对象是一个好主意。结合使用Array.prototype.every()Set.prototype.has()就足以进行检查了。

检查子集只需要反转参数的顺序即可。请注意,您可以将此函数用于任何类型的可迭代对象,而不仅仅是数组。

const superset = (a, b) => {
  const sA = new Set(a), sB = new Set(b);
  return [...sB].every(v => sA.has(v));
};

const subset = (a, b) => superset(b, a);

superset([1, 2, 3, 4], [1, 2, 2]); // true
superset([1, 2, 3, 4], [1, 3, 5]); // false

subset(new Set([1, 2]), new Set([1, 2, 3, 4])); // true
subset(new Set([1, 5]), new Set([1, 2, 3, 4])); // false

[!NOTE]

未来的ECMAScript版本可能会包含Set.prototype.isSupersetOf()Set.prototype.isSubsetOf(),这将使此代码段过时。