首先要说一句:我不知道您为什么将数组显式键入为object。如果您删除它,TypeScript 将正确推断类型为 string[]。
不要使用===比较内容
使用=== 将通过引用比较非原始值,如本例中的数组。所以两个不同的数组实例,即使内容相同,也永远不会相等。
当订单始终相同时使用.every()
如果数组中的顺序始终相同,可以使用.every,如下:
fff.every((value, index) => sss[index] === value)
当订单不同时使用Set
但是,您提到顺序可能不同。在这种情况下,您想使用Set。集合只能包含一个值的实例,并且可以快速告诉您给定值是否是该集合的成员。
理论上,您正在寻找两组的symmetric difference。这是在任一给定集合中的一组值,但不在两个给定集合中。
这是一个函数,它将数组转换为集合,计算对称差,并返回一个数组中的一个数组,而不是两个数组:
function symDifference(values1: string[], values2: string[]): string[] {
const notTheSame = new Set<string>();
const values1Set = new Set(values1);
const values2Set = new Set(values2);
for (const value1 of values1Set) {
if (!values2Set.has(value1)) {
notTheSame.add(value1);
}
}
for (const value2 of values2Set) {
if (!values1Set.has(value2)) {
notTheSame.add(value2);
}
}
return [...notTheSame];
}
这是一个CodeSandbox,您可以在其中玩。
最后注
您可能想使用 Array 的 .includes() 方法而不是使用 Sets。但是,对于较大的数组,复杂性和性能会呈指数级下降,因为这每次都会在数组上循环。