lambda - 如何比较 Ramda.js 中的 2 个集合?一个是否是另一个的超集?
问题描述
有没有比较 ramda.js 中的 2 个集合的好方法,一个是否是另一个的超集/子集?
例如,
const ss = new Set([1,2,3])
const s = new Set([1,2])
ss
是s
(s 是子集)的超集。
有没有一种简单的方法可以在 ramda.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))