From 77fd89e36991abbd02f35e498b874db034abca11 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Sat, 16 Dec 2017 18:40:38 +0200 Subject: [PATCH] Added symmetric difference as its own snippet, resolve #168 --- README.md | 17 ++++++++++++++++- snippets/array-difference.md | 10 +--------- snippets/array-symmetric-difference.md | 11 +++++++++++ tag_database | 1 + 4 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 snippets/array-symmetric-difference.md diff --git a/README.md b/README.md index b88fd06c3..af82b8f36 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * [Array intersection](#array-intersection) * [Array remove](#array-remove) * [Array sample](#array-sample) +* [Array symmetric difference](#array-symmetric-difference) * [Array union](#array-union) * [Array without](#array-without) * [Array zip](#array-zip) @@ -137,7 +138,7 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values no ```js const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; -// difference([1,2,3], [1,2]) -> [3] +// difference([1,2,3], [1,2,4]) -> [3] ``` [⬆ back to top](#table-of-contents) @@ -181,6 +182,20 @@ const sample = arr => arr[Math.floor(Math.random() * arr.length)]; [⬆ back to top](#table-of-contents) +### Array symmetric difference + +Create a `Set` from each array, then use `Array.filter()` on each of them to only keep values not contained in the other. + +```js +const symmetricDifference = (a, b) => { + const sA = new Set(a), sB = new Set(b); + return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; +} +// symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +``` + +[⬆ back to top](#table-of-contents) + ### Array union Create a `Set` with all values of `a` and `b` and convert to an array. diff --git a/snippets/array-difference.md b/snippets/array-difference.md index b70c2d837..defd82d6f 100644 --- a/snippets/array-difference.md +++ b/snippets/array-difference.md @@ -3,14 +3,6 @@ Create a `Set` from `b`, then use `Array.filter()` on `a` to only keep values not contained in `b`. ```js -const difference = (a, b) => { const s = new Set(b); a.filter(x => !s.has(x)); }; +const difference = (a, b) => { const s = new Set(b); return a.filter(x => !s.has(x)); }; // difference([1,2,3], [1,2,4]) -> [3] ``` - -This function can also be used to generate the symmetric difference or disjunctive union by swapping the -arrays and combining the results. - -```js -const symmetricDifference = (a, b) => [...difference(a,b), ...difference(b,a)]; -// difference([1,2,3], [1,2,4]) -> [3,4] -``` diff --git a/snippets/array-symmetric-difference.md b/snippets/array-symmetric-difference.md new file mode 100644 index 000000000..7d178cd15 --- /dev/null +++ b/snippets/array-symmetric-difference.md @@ -0,0 +1,11 @@ +### Array symmetric difference + +Create a `Set` from each array, then use `Array.filter()` on each of them to only keep values not contained in the other. + +```js +const symmetricDifference = (a, b) => { + const sA = new Set(a), sB = new Set(b); + return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))]; +} +// symmetricDifference([1,2,3], [1,2,4]) -> [3,4] +``` diff --git a/tag_database b/tag_database index c833e4f81..6cce617ea 100644 --- a/tag_database +++ b/tag_database @@ -4,6 +4,7 @@ array-difference:array array-intersection:array array-remove:array array-sample:array +array-symmetric-difference:array array-union:array array-without:array array-zip:array