One of these days I was looking for a library that would allow me to do simple set operations, mostly intersection and unions. There's so many that do it, like underscore, the problem I found was that none of them had a fluent API, so I took a take on doing my own.
Compatible with AMD and node.
A venn set is just an array on steroids:
var venn = require("venn")
venn.create([1,2])
console.log(venn) // [1,2]
You can now chain operations to this set, using union
or or
:
venn.create([1,2])
.union([1,2,3,4])
.or([5]) // [1,2,3,4,5]
union
and or
are just alias for the same operation.
venn.create([1,2])
.union([1,2,3,4])
.intersection([1,5]) // [1]
if you prefer you can also use and
instead of intersection
If you want to be negative about it, you can check out not
venn.create([1,2,3,4,5])
.not([4])
.not([5]) // [1,2,3]
Or a mix of everything
venn.create([1,2])
.or([1,2,3,4,5])
.and([1,5])
.or([2]) // [1,5,2]
If you're crazy you can use venn without a key function. We'll just figure it out how to index the objects.
venn.create([
{name: "vitor", age: "23"}
, {name: "khov", age: "24"}
, {name: "pat", age: "30"}])
.intersection([
{name: "vitor", age: "23"}
, {name: "newguy", age: "0"}
, {name: "pat", age: "50"}])
.union([
{name: "khov", age : "10"}
, {name: "nuno", age : "20"}])
// vitor, khov and nuno
But really, write your own key function:
var myKeyFunction = function(item) {
return item.name
}
venn.create([
{name: "vitor", age: "100"}
, {name: "khov", age: "100"}], myKeyFunction)
.and([
{name: "vitor", age: "0"}
, {name: "khov", age: "0"}
.or([
{name: "khov", age : "-100"}
, {name: "nuno", age : "20"}])
// vitor, khov(the first of them), nuno
- The keyFunction only needs to be set once for each venn object (as you would expect)
- Don't forget if you apply a built-in array function like
filter
ormap
the returning object is not a venn object (as you would once again expect)
Let me know if there are improvements I can do to the library. I might take some time to implement the other less used set operations.