How to sort a list on another list in lodash

Viewed 665

Gived a list

[
{id:'i1',value:'v1'},
{id:'i3',value:'v3'},
{id:'i4',value:'v4'},
{id:'i2',value:'v2'},
{id:'i5',value:'v5'},
]

and another ordered id list

['i1','i2','i3','i4','i5']

get

[
{id:'i1',value:'v1'},
{id:'i2',value:'v2'},
{id:'i3',value:'v3'},
{id:'i4',value:'v4'},
{id:'i5',value:'v5'},
]

How to do this in lodash?

4 Answers

Use sortBy method and return the id's index position from the iteratee function

let sortedArray = _.sortBy(input, (v) => order.indexOf(v.id))

where

input = [
  {id:'i1',value:'v1'},
  {id:'i3',value:'v3'},
  {id:'i4',value:'v4'},
  {id:'i2',value:'v2'},
  {id:'i5',value:'v5'},
]
order = ['i1','i2','i3','i4','i5']

Convert Array to Object where key is id for better lookup. Replace each element in ordered list with actual value.

Edge case: the two array has the same elements

const foo = [
  {id:'i1',value:'v1'},
  {id:'i3',value:'v3'},
  {id:'i4',value:'v4'},
  {id:'i2',value:'v2'},
  {id:'i5',value:'v5'},
];

const ordered = ['i1','i2','i3','i4','i5'];

const fooMap = _.keyBy(f, 'id');

const orderedFoo = ordered.map(id => fooMap[id])
const arr = ['i1','i2','i3','i4','i5'];
const arrObj = [
{id:'i1',value:'v1'},
{id:'i3',value:'v3'},
{id:'i4',value:'v4'},
{id:'i2',value:'v2'},
{id:'i5',value:'v5'}
]
const sortedArr = [];

_.map(arr, a => sortedArr.push(_.find(arrObj, ['id', a])));
console.log(sortedArr)
let arr = ['i1','i2','i3','i4','i5'];
let arrObj = [
    {id:'i1',value:'v1'},   
    {id:'i3',value:'v3'},
    {id:'i4',value:'v4'},
    {id:'i2',value:'v2'},
    {id:'i5',value:'v5'}
]

console.table(arrObj);

arr.map(v => {
    arrObj.sort( v1 => { return v1.id == v ? true : false} )
})

console.table(arrObj);
Related