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' } +] +*/ +```