Update and rename orderByEnum.md to orderWith.md
This commit is contained in:
@ -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
45
snippets/orderWith.md
Normal 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' }
|
||||
]
|
||||
*/
|
||||
```
|
||||
Reference in New Issue
Block a user