繁体   English   中英

Ramda:检查两个数组是否相等

[英]Ramda: Check if two arrays are equal

我还在学习JavaScript中的函数式编程,我很喜欢使用Ramda。

我有两个数组。 我想检查它们是否具有相同的值,与订单无关。 我认为这可以用equals来完成。 但显然

R.equals([1, 2], [2, 1]) // false

有没有一种有效的方法来检查两个数组是否相等? 我的数组是对象的常量,如果1 <X <10,那么它可以容纳X * 10E4值。

它之所以不起作用 - 除了Ramda函数被命名为equals而不是isEqual这一事实 - 是Arrays是本质上有序的容器。 [1, 2][2, 1] [1, 2]有实质性的不同

标准的无序容器是Set 不幸的是,这是基于引用相等,因此它可以获得Ramda认为相同的项目的多个副本。 所以最明显的答案将无法正常运作:

// ** Broken -- do not use **
const eqValues = (a1, a2) => R.equals(new Set(a1), new Set(a2))

console.log(eqValues(
  [{x: 1}, {x: 2}], 
  [{x: 1}, {x: 3}]
)) //=> false
console.log(eqValues(
  [{x: 1}, {x: 2}], 
  [{x: 2}, {x: 1}]
)) //=> true

因为在这种情况下由于长度检查会失败:

console.log(eqValues(
  [{x: 1}, {x: 2}, {x: 2}], 
  [{x: 2}, {x: 1}]
)) //=> false, but should be true, since {x: 2} is the same as {x: 2}

_Set没有暴露它的内部_Set类型 - 也许它应该 - 但是在诸如difference类的函数中使用它们 ,并且在symmetricDifference 使用它们 这些是用于测试其值相等的值的适当函数。

所以我的答案与bug中的答案相似,但我会用不同的方式说出来:

 const eqValues = compose(isEmpty, symmetricDifference) console.log(eqValues( [{x: 1}, {x: 2}], [{x: 1}, {x: 3}] )) //=> false console.log(eqValues( [{x: 1}, {x: 2}], [{x: 2}, {x: 1}] )) //=> true console.log(eqValues( [{x: 1}, {x: 2}], [{x: 2}, {x: 1}, {x: 1}] )) //=> true 
 <script src="https://bundle.run/ramda@0.26.1"></script><script> const {compose, isEmpty, symmetricDifference} = ramda; </script> 

但是,如果你需要测试多重性 - 也就是说, arr1包含{x: 42}两个副本而arr2只有一个,所以它们不同 - 那么我会使用来自customcommander的答案。

我会使用eqBycountBy

您可以使用countBy来构建数组的“配置文件”:

countBy(identity, [1, 2]);
//=> {"1": 1, "2": 1}

countBy(identity, [2, 1]);
//=> {"1": 1, "2": 1}

然后你可以用eqBy比较两个配置文件:

eqBy(countBy(identity), [1,2], [2,1])
//=> true

Ramda有很多方法可以实现这一目标

想到的是

R.length([1,2]) === R.length([2,1]) && R.isEmpty(R.symmetricDifference([1,2], [2,1]))

编辑 :使用R.difference而不是R.symmetricDifference不起作用,因为第一个只返回第一个列表中未包含在第二个列表中的元素。

R.difference([1,2], [2,1,3]) // -> []

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM