46 lines
1.3 KiB
Markdown
46 lines
1.3 KiB
Markdown
---
|
|
title: orderWith
|
|
tags: array,object,intermediate
|
|
---
|
|
|
|
Sorts an 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' }
|
|
]
|
|
*/
|
|
```
|