-1

I've got the following array of objects:

var source =  [
  {"name": "title_1", "category": "order"},
  {"name": "title_2", "category": "purchase"},
  {"name": "title_3", "category": "order"},
  {"name": "title_4", "category": "detail"},
  {"name": "title_5", "category": "order"},
  {"name": "title_6", "category": "purchase"},
]

I need to sort this array out to get elements in order (first - orders, second - detail, third - purchase):

console.log(source.sort(function () {
   // todo: ?
}))

Expected result:

[
  {"name": "title_1", "category": "order"},
  {"name": "title_3", "category": "order"},
  {"name": "title_5", "category": "order"},
  {"name": "title_4", "category": "detail"},
  {"name": "title_2", "category": "purchase"},
  {"name": "title_6", "category": "purchase"},
]

How to write sort function to get expected result?

Erik
  • 14,060
  • 49
  • 132
  • 218

1 Answers1

5

You could create an object which holds the priority of each category, then sort it based on that object.

const source =  [
  {"name": "title_1", "category": "order"},
  {"name": "title_2", "category": "purchase"},
  {"name": "title_3", "category": "order"},
  {"name": "title_4", "category": "detail"},
  {"name": "title_5", "category": "order"},
  {"name": "title_6", "category": "purchase"},
];

const priority = {
   order: 3,
   detail: 2,
   purchase: 1,
};

const r = source.sort((a, b) => priority[b.category] - priority[a.category]);
console.log(r);
kind user
  • 40,029
  • 7
  • 67
  • 77
  • 1
    This is a duplicate question, but you did provide a pretty good alternative answer. +1 – Ibu Dec 04 '18 at 21:27