Jarosław Wlazło
Jarosław Wlazło

Reputation: 81

Set order to array of object in javascript

I need to find a simplest way for setting order to array of objects. For example, there is an array:

var array = [
    {id: 1, name: "Matt"},
    {id: 2, name: "Jack"},
    {id: 3, name: "Morgan"},
    {id: 4, name: "Bruce"}
];

and I have provided

var order = [1,4,2,3];

which refers to object id property of array items.

Now I need to reorder array so it should be like:

var array = [
    {id: 1, name: "Matt"},
    {id: 4, name: "Bruce"},
    {id: 2, name: "Jack"},
    {id: 3, name: "Morgan"}
]

Upvotes: 8

Views: 3909

Answers (3)

Redu
Redu

Reputation: 26191

I guess anything that involves sort can not be more efficient than an O(2n) solution. So i would like to do this job with two reduces as follows;

var arr = [{id: 1, name: "Matt"}, {id: 2, name: "Jack"}, {id: 3, name: "Morgan"}, {id: 4, name: "Bruce"}],
  order = [1,4,2,3],
    lut = order.reduce((t,e,i) => (t[e] = i,t),{}),
 result = arr.reduce((res,obj) => (res[lut[obj.id]] = obj, res) ,[]);
 console.log(result);

Upvotes: 0

Nenad Vracar
Nenad Vracar

Reputation: 122085

You can also use reduce() on [1,4,2,3] array to return object where keys will be elements and values will be index of each element and then sort by that object.

var array = [
  {id: 1, name: "Matt"},
  {id: 2, name: "Jack"},
  {id: 3, name: "Morgan"},
  {id: 4, name: "Bruce"}
];

var s =  [1,4,2,3].reduce((r, e, i) => {return r[e] = i, r}, {});
var result = array.sort(function(a, b) {
  return s[a.id] - s[b.id];
});
console.log(result)

Upvotes: 2

Pranav C Balan
Pranav C Balan

Reputation: 115242

Use Array#sort method for sorting and inside custom sort function use Array#indexOf method to get index.

var array = [{
  id: 1,
  name: "Matt"
}, {
  id: 2,
  name: "Jack"
}, {
  id: 3,
  name: "Morgan"
}, {
  id: 4,
  name: "Bruce"
}];

var order = [1, 4, 2, 3];


array.sort(function(a, b) {
  // sort based on the index in order array
  return order.indexOf(a.id) - order.indexOf(b.id);
})

console.log(array);

Upvotes: 13

Related Questions