Simple set data type, with API similar to Python's sets module.
This provides a set data type, with an API very close to that of Python's sets module.
If you have the node package manager, this is easy:
npm install simplesets
You could also clone the git repository, and install it manually.
Here's an example of how you use it:
var sets = require'simplesets';var s1 = 'hello' 'world' 'how' 'are' 'you' 'today';var s2 = 'say' 'hello' 'to' 'the' 'world';// Print out both of the sets, as arrays of their elements.console.log's1 =' s1array;console.log's2 =' s2array;// Do some set operations.console.log'Intersection:' s1intersections2array;console.log's1 - s2:' s1differences2array;console.log's2 - s1:' s2differences1array;console.log'Union:' s1unions2array;// Make a set with numbers and strings.var s3 = 1 2 3 'a' 'b' 'c';console.log'Mixing data types:' s3array;// Add in some more data types.var my_dict = foo: 42 bar: 'bazaar';s3addmy_dict; // This will add to the set...s3addmy_dict; // ...but now this will do nothing.s3remove3;s3remove'c';console.log'New s3 =' s3array;// You can make shallow copies of sets.var s4 = 1 2 3;var s5 = s4copy;s4add42;s5remove2;console.log's4 =' s4array;console.log's5 =' s5array;
=== operation, and unsorted arrays. For small sets, this is not a problem. For larger sets, if performance of set operations turns out to be problematic, you may want to use a specialized set data type. For example, if your set members are all strings, you could represent sets as objects with set members as keys, and it would be fast. For this, use the
StringSet class, described below.
Set class has the following methods:
new Set(items): Creates a new set. If an array
itemsis given, its contents will be added to the set.
has(x): Does this set contain an element
add(x): Add an element
xto this set, and return this set.
remove(x): Remove an element
xfrom this set, if it is part of the set. If it is not part of the set, do nothing. Returns this set.
union(other): Return a new set containing the items found in either this set, the other set, or both.
intersection(other): Return a new set containing the items found in both this set and the other set.
difference(other): Return a new set containing the items in this set that are not in the other set.
symmetric_difference(other): Return a new set containing the items in either this set or the other set, but not both.
trueif every element of this set is in the other set.
trueif every element of the other is in this set.
trueif this set equals another set, i.e. if every element in each set is equal to an element in the other set.
array(): Return a copy of the items in the set, as an array.
size(): Return the size of the set.
copy(): Return a shallow copy of the set.
pop(): Remove and return a random element of the set, or null if the set is empty.
pick(): Return a random element of the set, or null if the set is empty. Unlike
pop, does not remove the element from the set.
each(callback): Call a callback function on each element of the set. If the set is changed by the callback, the results are undefined. The callback takes a single argument: the set element that it's being called on. Callback takes the same parameters as the forEach method of arrays: value, index, set. Takes an optional parameter that sets what this is bound to.
The condition for determining whether two values are equal is the
=== operator. Therefore sets can support any mix of data types, as long as the data types can be compared for equality in some meaningful sense with
StringSet class behaves just like the
Set class, but it uses this object-based encoding and requires that all set members have unique string representations. Instantiate it with
new StringSet(items), and the API is the same as described above.
Set will generally be faster and more memory-efficient than
StringSet for sets with fewer than around 110 elements.
StringSet is good for large sets, though.