Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

362
Views
Javascript sort array of objects using array of priority

I have this array of objects:

var eventList = [
    {
        eventName: "abc",
        status: "completed"
    },
    {
        eventName: "def",
        status: "live"
    },
    {
        eventName: "ghi",
        status: "live"
    },
    {
        eventName: "jkl",
        status: "upcoming"
    },
]

I want to sort these array of objects using a priority array of a specific key, say ["live", "upcoming", "completed"] for status, meaning all live events come first, followed by upcoming followed by completed. Answers all over the internet seem like you can only sort array objects using keys as ascending or descending. How to I approach this?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

You could do it using Array.prototype.sort() method with an ordering array.

const eventList = [
  {
    eventName: 'abc',
    status: 'completed',
  },
  {
    eventName: 'def',
    status: 'live',
  },
  {
    eventName: 'ghi',
    status: 'live',
  },
  {
    eventName: 'jkl',
    status: 'upcoming',
  },
];

const order = ['live', 'upcoming', 'completed'];
eventList.sort((x, y) => order.indexOf(x.status) - order.indexOf(y.status));
console.log(eventList);

If you would want to make index searching faster when sorting you could use Map Object.

const eventList = [
  {
    eventName: 'abc',
    status: 'completed',
  },
  {
    eventName: 'def',
    status: 'live',
  },
  {
    eventName: 'ghi',
    status: 'live',
  },
  {
    eventName: 'jkl',
    status: 'upcoming',
  },
];

const order = ['live', 'upcoming', 'completed'];
const map = new Map();
order.forEach((x, i) => map.set(x, i));
eventList.sort((x, y) => map.get(x.status) - map.get(y.status));
console.log(eventList);

over 4 years ago · Santiago Trujillo Report

0

You can do this without sorting for a linear time complexity by first grouping your array based on status, and then using .flatMap() on your order array. For each value in the ordered array, you can grab the grouped value from the grouping in O(1) (ie: instantly), and map those grouped objects. As you're using flatMap these grouped objects will be flattened into the resulting array:

const eventList = [ { eventName: "abc", status: "completed" }, { eventName: "def", status: "live" }, { eventName: "ghi", status: "live" }, { eventName: "jkl", status: "upcoming" }, ];

const order = ["live", "upcoming", "completed"];
const grouped = eventList.reduce(
  (map, o) => map.set(o.status, (map.get(o.status) || []).concat(o)), new Map
);

const result = order.flatMap(status => grouped.get(status) || []);
console.log(result);

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!