Martyn Ball
Martyn Ball

Reputation: 4895

JavaScript sort array of objects based on an array of values

I need to sort my list using the selected array.

const list = [
    { name: 'BMW' },
    { name: 'AUDI' },
    { name: 'MINI' },
    { name: 'FIAT' },
    { name: 'KIA' },
]

const selected = [ 'MINI', 'KIA' ]

What is the best way to do this? I have found some examples but not too sure how to adapt this to work the way I want it to!

list.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))

Expected result:

const list = [
    { name: 'MINI' },
    { name: 'KIA' },
    { name: 'BMW' },
    { name: 'AUDI' },
    { name: 'FIAT' },
]

Upvotes: 1

Views: 73

Answers (1)

Guerric P
Guerric P

Reputation: 31835

You could use Array.prototype.includes and take advantage of JavaScript's numbers coercion like this:

const list = [
  { name: "BMW" },
  { name: "AUDI" },
  { name: "MINI" },
  { name: "FIAT" },
  { name: "KIA" },
];

const selected = ["MINI", "KIA"];

const sorted = list.sort(
  (a, b) => selected.includes(b.name) - selected.includes(a.name)
);

console.log(sorted);

If the order of the elements has to remain the same and be consistent across browsers:

const list = [
  { name: "BMW" },
  { name: "AUDI" },
  { name: "MINI" },
  { name: "FIAT" },
  { name: "KIA" },
];

const selected = ["MINI", "KIA"];

const sorted = list.sort(
  (a, b) =>
    selected.includes(b.name) - selected.includes(a.name) ||
    list.indexOf(a) - list.indexOf(b)
);

console.log(sorted);

Upvotes: 1

Related Questions