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