From 4825da1594797d0a11e34b89c321d0d63f83db2f Mon Sep 17 00:00:00 2001 From: JanMalch <25508038+JanMalch@users.noreply.github.com> Date: Sat, 3 Oct 2020 17:35:23 +0200 Subject: [PATCH 1/2] Add orderByEnum snippet --- snippets/orderByEnum.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 snippets/orderByEnum.md diff --git a/snippets/orderByEnum.md b/snippets/orderByEnum.md new file mode 100644 index 000000000..a6b845094 --- /dev/null +++ b/snippets/orderByEnum.md @@ -0,0 +1,31 @@ +--- +title: orderByEnum +tags: array,intermediate +--- + +Returns a sorted array of objects ordered by a property, which has a known set of values (enum). +The desired order is defined by the given `order` array. + +- Uses the `order` array's `indexOf` method to find the desired order for the respective value. +- Uses the difference of both indices to determine the order, as any negative or positive number suffices (not just `-1` or `1`). +- Throws an error if the property has an unknown value. + +```js +const orderByEnum = (arr, prop, order) => + [...arr].sort((a, b) => { + const aOrderIndex = order.indexOf(a[prop]), bOrderIndex = order.indexOf(b[prop]); + if (aOrderIndex === -1) { + throw new Error(`Unexpected value ${a[prop]}`) + } + if (bOrderIndex === -1) { + throw new Error(`Unexpected value ${b[prop]}`) + } + return aOrderIndex - bOrderIndex; + }); +``` + +```js +const users = [{ name: 'fred', language: 'Javascript' }, { name: 'barney', language: 'TypeScript' }, { name: 'frannie', language: 'Javascript' }, { name: 'anna', language: 'Java' }] +orderByEnum(users, 'language', ['Javascript', 'TypeScript', 'Java']) +// [{name: "fred", language: "Javascript"}, {name: "frannie", language: "Javascript"}, {name: "barney", language: "TypeScript"}, {name: "anna", language: "Java"}] +``` From 18bd57139a730e96acaa40ef84532d2ddac916e6 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Sun, 4 Oct 2020 12:11:10 +0300 Subject: [PATCH 2/2] Update and rename orderByEnum.md to orderWith.md --- snippets/orderByEnum.md | 31 ---------------------------- snippets/orderWith.md | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 31 deletions(-) delete mode 100644 snippets/orderByEnum.md create mode 100644 snippets/orderWith.md diff --git a/snippets/orderByEnum.md b/snippets/orderByEnum.md deleted file mode 100644 index a6b845094..000000000 --- a/snippets/orderByEnum.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: orderByEnum -tags: array,intermediate ---- - -Returns a sorted array of objects ordered by a property, which has a known set of values (enum). -The desired order is defined by the given `order` array. - -- Uses the `order` array's `indexOf` method to find the desired order for the respective value. -- Uses the difference of both indices to determine the order, as any negative or positive number suffices (not just `-1` or `1`). -- Throws an error if the property has an unknown value. - -```js -const orderByEnum = (arr, prop, order) => - [...arr].sort((a, b) => { - const aOrderIndex = order.indexOf(a[prop]), bOrderIndex = order.indexOf(b[prop]); - if (aOrderIndex === -1) { - throw new Error(`Unexpected value ${a[prop]}`) - } - if (bOrderIndex === -1) { - throw new Error(`Unexpected value ${b[prop]}`) - } - return aOrderIndex - bOrderIndex; - }); -``` - -```js -const users = [{ name: 'fred', language: 'Javascript' }, { name: 'barney', language: 'TypeScript' }, { name: 'frannie', language: 'Javascript' }, { name: 'anna', language: 'Java' }] -orderByEnum(users, 'language', ['Javascript', 'TypeScript', 'Java']) -// [{name: "fred", language: "Javascript"}, {name: "frannie", language: "Javascript"}, {name: "barney", language: "TypeScript"}, {name: "anna", language: "Java"}] -``` diff --git a/snippets/orderWith.md b/snippets/orderWith.md new file mode 100644 index 000000000..3a3668a3d --- /dev/null +++ b/snippets/orderWith.md @@ -0,0 +1,45 @@ +--- +title: orderWith +tags: array,object,intermediate +--- + +Returns a sorted array of objects ordered by a property, based on the array of orders provided. + +- Use `Array.prototype.reduce()` to create an object from the `order` array with the values as keys and their original index as the value. +- Use `Array.prototype.sort()` to sort the given array, skipping elements for which `prop` is empty or not in the `order` array. + +```js +const orderWith = (arr, prop, order) => { + const orderValues = order.reduce((acc, v, i) => { + acc[v] = i; + return acc; + }, {}); + return [...arr].sort((a, b) => { + if (orderValues[a[prop]] === undefined) return 1; + if (orderValues[b[prop]] === undefined) return -1; + return orderValues[a[prop]] - orderValues[b[prop]]; + }); +}; +``` + +```js +const users = [ + { name: 'fred', language: 'Javascript' }, + { name: 'barney', language: 'TypeScript' }, + { name: 'frannie', language: 'Javascript' }, + { name: 'anna', language: 'Java' }, + { name: 'jimmy' }, + { name: 'nicky', language: 'Python' }, +]; +orderWith(users, 'language', ['Javascript', 'TypeScript', 'Java']); +/* +[ + { name: 'fred', language: 'Javascript' }, + { name: 'frannie', language: 'Javascript' }, + { name: 'barney', language: 'TypeScript' }, + { name: 'anna', language: 'Java' }, + { name: 'jimmy' }, + { name: 'nicky', language: 'Python' } +] +*/ +```