Update and rename orderByEnum.md to orderWith.md

This commit is contained in:
Angelos Chalaris
2020-10-04 12:11:10 +03:00
committed by GitHub
parent 4825da1594
commit 18bd57139a
2 changed files with 45 additions and 31 deletions

View File

@ -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"}]
```

45
snippets/orderWith.md Normal file
View File

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