使用 lodash 比较锯齿状数组(没有顺序的项目存在)

2022-08-30 02:00:40

我知道我可以使用循环来做到这一点,但我试图找到一种优雅的方式来做到这一点:

我有两个交错数组(数组数组):

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

我想用它来确认上面两个交错数组是相同的。通过“相同”,我的意思是没有不包含在 中的项目。请注意,交错数组中的项实际上是数组。所以我想比较内部数组。lodasharray1array2

在检查这些项目之间的相等性方面:

['a', 'b'] == ['b', 'a'] 

['a', 'b'] == ['a', 'b'] 

两者都有效,因为字母将始终按顺序排列。


更新:最初的问题是关于“数组”(而不是锯齿状数组),多年来,许多人讨论(并添加了答案)关于比较简单的一维数组(没有注意到问题中提供的示例实际上与他们期望的简单一维数组并不相似)。


答案 1

如果对外部数组进行排序,则可以使用 _.isEqual(),因为内部数组已经过排序。

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true

请注意,这将改变数组。如果这对您来说是一个问题,请先使用(例如)或点差运算符()进行复制。.sort().slice()...

或者,按照Daniel Budick在下面的评论中建议的那样:

_.isEqual(_.sortBy(array1), _.sortBy(array2))

Lodash不会改变数组。sortBy()


答案 2

你可以为此使用 lodashsxor

doArraysContainSameElements = _.xor(arr1, arr2).length === 0

如果您认为数组 [1, 1] 与数组 [1] 不同,那么您可以像这样提高性能:

doArraysContainSameElements = arr1.length === arr2.length && _.xor(arr1, arr2).length === 0