diff --git a/snippets/symmetricDifference.md b/snippets/symmetricDifference.md index 6f13806e4..854af0f30 100644 --- a/snippets/symmetricDifference.md +++ b/snippets/symmetricDifference.md @@ -1,6 +1,6 @@ ### symmetricDifference -Returns the symmetric difference between two arrays. +Returns the symmetric difference between two arrays, without filtering out duplicate values. Create a `Set` from each array, then use `Array.filter()` on each of them to only keep values not contained in the other. @@ -13,5 +13,6 @@ const symmetricDifference = (a, b) => { ``` ```js -symmetricDifference([1, 2, 3], [1, 2, 4]); // [3,4] +symmetricDifference([1, 2, 3], [1, 2, 4]); // [3, 4] +symmetricDifference([1, 2, 2], [1, 3, 1]); // [2, 2, 3] ``` diff --git a/snippets/uniqueSymmetricDifference.md b/snippets/uniqueSymmetricDifference.md new file mode 100644 index 000000000..99afdadfe --- /dev/null +++ b/snippets/uniqueSymmetricDifference.md @@ -0,0 +1,16 @@ +### uniqueSymmetricDifference + +Returns the unique symmetric difference between two arrays, not containing duplicate values from either array. + +Use `Array.filter()` and `Array.includes()` on each array to remove values contained in the other, then create a `Set` from the results, removing duplicate values. + +```js +const uniqueSymmetricDifference = (a, b) => [ + ...new Set([...a.filter(v => !b.includes(v)), ...b.filter(v => !a.includes(v))]) +]; +``` + +```js +uniqueSymmetricDifference([1, 2, 3], [1, 2, 4]); // [3, 4] +uniqueSymmetricDifference([1, 2, 2], [1, 3, 1]); // [2, 3] +``` diff --git a/tag_database b/tag_database index 92f0c81ad..25701b373 100644 --- a/tag_database +++ b/tag_database @@ -302,6 +302,7 @@ unionWith:array,function uniqueElements:array uniqueElementsBy:array,function uniqueElementsByRight:array,function +uniqueSymmetricDifference:array,math untildify:node,string unzip:array unzipWith:array,function,advanced diff --git a/test/symmetricDifference/symmetricDifference.test.js b/test/symmetricDifference/symmetricDifference.test.js index 7fc364488..c96e3b5a6 100644 --- a/test/symmetricDifference/symmetricDifference.test.js +++ b/test/symmetricDifference/symmetricDifference.test.js @@ -7,3 +7,6 @@ test('symmetricDifference is a Function', () => { test('Returns the symmetric difference between two arrays.', () => { expect(symmetricDifference([1, 2, 3], [1, 2, 4])).toEqual([3, 4]); }); +test('Returns duplicates from one array', () => { + expect(symmetricDifference([1, 2, 2], [1, 3, 1])).toEqual([2, 2, 3]); +}); diff --git a/test/uniqueSymmetricDifference/uniqueSymmetricDifference.js b/test/uniqueSymmetricDifference/uniqueSymmetricDifference.js new file mode 100644 index 000000000..62cb18a5f --- /dev/null +++ b/test/uniqueSymmetricDifference/uniqueSymmetricDifference.js @@ -0,0 +1,4 @@ +const uniqueSymmetricDifference = (a, b) => [ + ...new Set([...a.filter(v => !b.includes(v)), ...b.filter(v => !a.includes(v))]) +]; +module.exports = uniqueSymmetricDifference; diff --git a/test/uniqueSymmetricDifference/uniqueSymmetricDifference.test.js b/test/uniqueSymmetricDifference/uniqueSymmetricDifference.test.js new file mode 100644 index 000000000..788d1f65e --- /dev/null +++ b/test/uniqueSymmetricDifference/uniqueSymmetricDifference.test.js @@ -0,0 +1,12 @@ +const expect = require('expect'); +const uniqueSymmetricDifference = require('./uniqueSymmetricDifference.js'); + +test('uniqueSymmetricDifference is a Function', () => { + expect(uniqueSymmetricDifference).toBeInstanceOf(Function); +}); +test('Returns the symmetric difference between two arrays.', () => { + expect(uniqueSymmetricDifference([1, 2, 3], [1, 2, 4])).toEqual([3, 4]); +}); +test('Does not return duplicates from one array', () => { + expect(uniqueSymmetricDifference([1, 2, 2], [1, 3, 1])).toEqual([2, 3]); +});