Prepare repository for merge
This commit is contained in:
48
javascript/snippets/order-with.md
Normal file
48
javascript/snippets/order-with.md
Normal file
@ -0,0 +1,48 @@
|
||||
---
|
||||
title: Order array of objects based on property order
|
||||
type: snippet
|
||||
tags: [array,object]
|
||||
cover: san-francisco-skyline
|
||||
dateModified: 2020-10-21T21:54:53+03:00
|
||||
---
|
||||
|
||||
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' }
|
||||
]
|
||||
*/
|
||||
```
|
||||
Reference in New Issue
Block a user