首页 > 解决方案 > 如何比较 Ramda.js 中的 2 个集合?一个是否是另一个的超集?

问题描述

有没有比较 ramda.js 中的 2 个集合的好方法,一个是否是另一个的超集/子集?

例如,

const ss = new Set([1,2,3])

const s = new Set([1,2])

sss(s 是子集)的超集。

有没有一种简单的方法可以在 ramda.js 中实现这一点?

标签: lambdafunctional-programmingramda.js

解决方案


Jared 的回答很简洁,但如果要比较的集合相当大,那么它就不是一种有效的算法。

考虑这个短路程序 -

const isSubsetOf = (super, sub) => {
  for (const s of sub)
    if (!super.has(s))
      return false
  return true
}

在另一个问答中,如何在 JavaScript 中映射/减少/过滤 Set?,我们探索如何将函数式方法添加到Set.prototype. 对我们特别有用的一项是Set.prototype.every-

Set.prototype.every = function every(f) {
  for (const v of this) if (!f(v)) return false
  return true
}

这将允许您将程序重写为 -

const isSubsetOf = (super, sub) =>
  sub.every(s => super.has(s))

如果您正在编写库、框架或工具等共享软件,则不建议修改本机原型。但是,如果这是您的程序并且您不希望它成为其他人项目的依赖项,那么修改任何原型(本机或其他)以满足您的需要并没有错。

如果您无法修改Set.prototype,仍然可以使用功能 API -

const setEvery = (set, f) => {
  for (const v of this) if (!f(v)) return false
  return true
}

const isSubsetOf = (super, sub) =>
  setEvery(sub, s => super.has(s))

推荐阅读