Search code examples
javascriptarraysobjectlodash

Sort array of objects based on another array


I have a array of makes as follows:

const makes = [
{id: "4", name: "Audi"},
{id: "5", name: "Bmw"},
{id: "6", name: "Porsche"},
{id: "31", name: "Seat"},
{id: "32", name: "Skoda"},
{id: "36", name: "Toyota"},
{id: "38", name: "Volkswagen"}
]

And I want to sort that array based on another array:

const preferred_makes = ['Volkswagen', 'Audi'];

What I do now is as follows:

const preferred_makes = ['Volkswagen', 'Audi'];

const makes = [
{id: "4", name: "Audi"},
{id: "5", name: "Bmw"},
{id: "6", name: "Porsche"},
{id: "31", name: "Seat"},
{id: "32", name: "Skoda"},
{id: "36", name: "Toyota"},
{id: "38", name: "Volkswagen"}
]

const mainMakes = []
const otherMakes = []

makes.map(make => _.includes(preferred_makes, make.name) ? mainMakes.push(make) : otherMakes.push(make))

console.log(mainMakes)
console.log(otherMakes)

But is there any better way? Can I sort makes to show those preferred_makes as first elements of the array?

Here is the fiddle.


Solution

  • A regular array.sort() with a custom comparison function should be able to do this.

    const preferred_makes = ['Volkswagen', 'Audi'];
    
    const makes = [
      {id: "4", name: "Audi"},
      {id: "5", name: "Bmw"},
      {id: "6", name: "Porsche"},
      {id: "31", name: "Seat"},
      {id: "32", name: "Skoda"},
      {id: "36", name: "Toyota"},
      {id: "38", name: "Volkswagen"}
    ]
    
    const sorted = makes.slice().sort((a, b) => {
      // Convert true and false to 1 and 0
      const aPreferred = new Number(preferred_makes.includes(a.name))
      const bPreferred = new Number(preferred_makes.includes(b.name))
      
      // Return 1, 0, or -1
      return bPreferred - aPreferred
    })
    
    console.log(sorted)