# Sorted Union - freeCodeCamp using Modern JavaScript #10

Did someone say unique values? It't time for `Set`! This is an exercise where ES6 can really shine, `Set` is made to store unique values, and that's exactly what we're asked to do here. Let's take it step-by-step.

We're given an arbitrary number of arrays as input, so let's use a rest parameter to collect them all into a single arguments array that we can work with.

``````const uniteUnique = (...arrays) => {
// ...
};
``````

We need to get the values out of each array that was passing into our function, so now that we've collected them all we need to spread them out again. We will also concatenate them to get a single array containing all the values we are interested in.

``````Array.prototype.concat(...arrays)
``````

In the next step we'll use our `Set` trick. By calling `new Set()` on an array we easily and declaratively eliminate duplicates.

Last step is to turn the `Set` back into an array that freeCodeCamp expects as output. We can use `Array.from` to get the solution.

``````const uniteUnique = (...arrays) => {
const set = new Set(Array.prototype.concat(...arrays));
return Array.from(set);
};
``````

## Advanced solution: flatten arrays recursively

Interestingly freeCodeCamp specifically wants nested arrays in place, as seen in one of their tests:

uniteUnique([1, 3, 2], [1, ], [2, ]) should return [1, 3, 2, , ].

As an advanced exercise though let's write a recursive function that allows us to put in arbitrarily deeply nested arrays.

We `reduce` the input, test if the next element is an array with `Array.isArray()`, and if so recursively `concat` it together.

``````const flatten = array => array
.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);

const uniteUnique = (...arrays) => Array.from(new Set(flatten(arrays)));
``````