2

I have an array

peeps = [{name: "Mike", age: 31},{name: "Dave", age: 31},{name: "Delta", age: 31},{name: "Clint", age: 31}] 

And I need to sort them by an arbitrary order of

newOrder = ['Delta', 'Dave', 'Mike', 'Clint']

How would I reference newOrder to sort peeps, also bear in mind the data in peeps is not guaranteed to have all the names in newOrder

UXCODA
  • 1,118
  • 2
  • 18
  • 33
  • 1
    please add your code. what have you tried? – Nina Scholz Nov 26 '20 at 09:01
  • The name will be known, newOrder will be static but peeps might have all the names or only 1 of the names in peeps. I've tried to figure out a way to do it by sorting alphabetically and then reversing the order but I cant figure it out. – UXCODA Nov 26 '20 at 09:03

2 Answers2

4

const peeps = [
  { name: 'Mike', age: 31 },
  { name: 'Dave', age: 31 },
  { name: 'Delta', age: 31 },
  { name: 'Clint', age: 31 }
];
const newOrder = ['Delta', 'Dave', 'Mike', 'Clint'];

peeps.sort((a, b) => newOrder.indexOf(a.name) - newOrder.indexOf(b.name));

console.log(peeps);
michael
  • 4,053
  • 2
  • 12
  • 31
2

This is one way:

const peeps = [{name: "Mike", age: 31},{name: "Dave", age: 31},{name: "Delta", age: 31},{name: "Clint", age: 31}];
const newOrder = ['Delta', 'Dave', 'Mike', 'Clint'];

const notInNewOrder = peeps.filter(i => !newOrder.includes(i.name));

const response = newOrder.map(n => ({...peeps.find(peep=> peep.name === n)}));

console.log(response.concat(notInNewOrder));
Ran Marciano
  • 1,431
  • 5
  • 13
  • 30