Find the Symmetric Difference
Problem Explanation
Symmetric difference (commonly denoted by Δ) of two sets is the set of elements which are in either of the two sets, but not in both.
For example, sym([1, 2, 3], [5, 2, 1, 4])
should yield [3, 4, 5]
.
Following above definition, symmetric difference of three sets A, B, and C can be expressed as (A Δ B) Δ C
.
Relevant Links
Hints
Hint 1
The arguments object is Array-like object that only inherits Array.length
property. Hence consider converting it to an actual Array.
Hint 2
Deem writing a helper function that returns the symmetric difference of two arrays on each call instead of attempting to difference all sets simultaneously.
Hint 3
Apply helper function against the created arguments array reducing its elements pairwise recursively to form the expected output.
Note
In the event of odd number of sets the symmetric difference will include identical elements present in all given sets. For instance;
A = {1, 2, 3}
B = {2, 3, 4}
C = {3, 4, 5}
(A ⋂ B) ⋂ C = {1, 4} &Intersection {3, 4, 5}
A ⋂ B = {1, 3, 5}
Solutions
Solution 1 (Click to Show/Hide)
function sym() {
const args = [];
for (let i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
function symDiff(arrayOne, arrayTwo) {
const result = [];
arrayOne.forEach(function (item) {
if (arrayTwo.indexOf(item) < 0 && result.indexOf(item) < 0) {
result.push(item);
}
});
arrayTwo.forEach(function (item) {
if (arrayOne.indexOf(item) < 0 && result.indexOf(item) < 0) {
result.push(item);
}
});
return result;
}
// Apply reduce method to args array, using the symDiff function
return args.reduce(symDiff);
}
Code Explanation
-
push()
is used to break down the arguments object to an array, args. - The
symDiff
function finds the symmetric difference between two sets. It is used as a callback function for thereduce()
method called on args. -
arrayOne.forEach()
pushes the elements to result which are present only in arrayOne as well as not already a part of result. -
arrayTwo.forEach()
pushes the elements to result which are present only in arrayTwo as well as not already a part of result. - The result, which is the symmetric difference is returned. This solution works for any number of sets.
Relevant Links
Solution 2 (Click to Show/Hide)
function sym(...args) {
// Return the symmetric difference of 2 arrays
const getDiff = (arr1, arr2) => {
// Returns items in arr1 that don't exist in arr2
function filterFunction(arr1, arr2) {
return arr1.filter(item => arr2.indexOf(item) === -1);
}
// Run filter function on each array against the other
return filterFunction(arr1, arr2).concat(filterFunction(arr2, arr1));
};
// Reduce all arguments getting the difference of them
const summary = args.reduce(getDiff, []);
// Run filter function to get the unique values
const unique = summary.filter((elem, index, arr) => index === arr.indexOf(elem));
return unique;
}
Code Explanation
- The
getDiff
function finds the symmetric difference between two sets, arr1 and arr2. It is used as a callback function for thereduce()
method called on args. - The first
filterFunction()
returns elements in arr1 that don’t exist in arr2. - The next
filterFunction()
is run on each array against the other to check the inverse of the first check for uniqueness and concatenate it. - summary consists of the reduced arguments.
-
filter()
is used on summary to keep only the unique values and unique is returned.
Relevant Links
Solution 3 (Click to Show/Hide)
const diff = (arr1, arr2) => [
...arr1.filter(e => !arr2.includes(e)),
...arr2.filter(e => !arr1.includes(e))
];
const sym = (...args) => [...new Set(args.reduce(diff))];
// test here
sym([1, 2, 3], [5, 2, 1, 4]);
Code Explanation
-
The main function sym() reduces given arrays utilising helper function diff() to a single array. Also, it temporary converts the result to Set to remove duplicates.
-
The function diff() returns the symmetric difference of two arrays by picking out elements in parameterised arrays; arr1 and arr2.