Max Maddy
Max Maddy

Reputation: 349

Quickest way to sort an array based on another array

Below are my two arrays, what is the quickest way to sort one array based on another.

var MainArray = [{
  guid: '24c2b868-8f4d-4113-a537-f8e7f57bb88b',
  info: 'photo 1'
}, {
  guid: '27e910cf-ba4c-412c-9faf-e7db5f058639',
  info: 'photo 2'
}, {
  guid: '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c',
  info: 'photo 3'
}, {
  guid: 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e',
  info: 'photo 4'
}, {
  guid: '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f',
  info: 'photo 5'
}];




var newArray = [{
  id: 1,
  name: 'name1',
  guid: '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f'
}, {
  id: 2,
  name: 'name2',
  guid: 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e'
}, {
  id: 3,
  name: 'name3',
  guid: '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c'
}, {
  id: 4,
  name: 'name4',
  guid: '27e910cf-ba4c-412c-9faf-e7db5f058639'
}, {
  id: 5,
  name: 'name5',
  guid: '24c2b868-8f4d-4113-a537-f8e7f57bb88b'
}];

I want new Array to be sorted based on guid of MainArray, how can i do that?

Upvotes: 2

Views: 877

Answers (3)

Prem G
Prem G

Reputation: 190

Pranav C Balan's answer works, i would like to share another way of solving it.

// mapping over MainArray since it contains sorted order
let sortedArr = MainArray.map((mainArrObject,i) => {

//filtering each newArray object based on MainArray index
 return newArray.filter(newArrObject => {
  return newArrObject.guid == MainArray[i].guid
 })[0]

})


console.log(sortedArr)

var MainArray = [{
  guid: '24c2b868-8f4d-4113-a537-f8e7f57bb88b',
  info: 'photo 1'
}, {
  guid: '27e910cf-ba4c-412c-9faf-e7db5f058639',
  info: 'photo 2'
}, {
  guid: '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c',
  info: 'photo 3'
}, {
  guid: 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e',
  info: 'photo 4'
}, {
  guid: '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f',
  info: 'photo 5'
}];

var newArray = [{
  id: 1,
  name: 'name1',
  guid: '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f'
}, {
  id: 2,
  name: 'name2',
  guid: 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e'
}, {
  id: 3,
  name: 'name3',
  guid: '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c'
}, {
  id: 4,
  name: 'name4',
  guid: '27e910cf-ba4c-412c-9faf-e7db5f058639'
}, {
  id: 5,
  name: 'name5',
  guid: '24c2b868-8f4d-4113-a537-f8e7f57bb88b'
}];

let sortedArr = MainArray.map((mainArrObject,i) => {
 return newArray.filter(newArrObject => {
  return newArrObject.guid == MainArray[i].guid
 })[0]

})

console.log(sortedArr)

Upvotes: 0

Alastair Brown
Alastair Brown

Reputation: 1616

Try using a map that maps your guid values to your info values:

var MainArray = [ { guid : '24c2b868-8f4d-4113-a537-f8e7f57bb88b',info : 'photo 1'},
                  { guid : '27e910cf-ba4c-412c-9faf-e7db5f058639',info : 'photo 2'},
                  { guid : '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c',info : 'photo 3'},
                  { guid : 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e',info : 'photo 4'},
                  { guid : '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f',info : 'photo 5'}
                   ];

var newArray = [{id : 1,name : 'name1',guid:'6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f'},
               {id : 2,name : 'name2',guid:'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e'},
               {id : 3,name : 'name3',guid:'66fc9e12-1c0a-447c-81c8-2f3a4bf0608c'},
               {id : 4,name : 'name4',guid:'27e910cf-ba4c-412c-9faf-e7db5f058639'},
               {id : 5,name : 'name5',guid:'24c2b868-8f4d-4113-a537-f8e7f57bb88b'}];

var map = {};

for (var i = 0; i < MainArray.length; i++) {
  map[MainArray[i].guid] = MainArray[i].info;
}

newArray.sort(function(a,b){return map[a.guid].localeCompare(map[b.guid]);})

Upvotes: 0

Pranav C Balan
Pranav C Balan

Reputation: 115272

Generate an object which refers the index in main array and sort based on that

// object for storing reference to index
var obj = {};

// iterate and store index reference in object
MainArray.forEach(function(v, i) {
  obj[v.guid] = i;
});

// sort based on the index
newArray.sort(function(a, b) {
  return obj[a.guid] - obj[b.guid];
});

var MainArray = [{
  guid: '24c2b868-8f4d-4113-a537-f8e7f57bb88b',
  info: 'photo 1'
}, {
  guid: '27e910cf-ba4c-412c-9faf-e7db5f058639',
  info: 'photo 2'
}, {
  guid: '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c',
  info: 'photo 3'
}, {
  guid: 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e',
  info: 'photo 4'
}, {
  guid: '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f',
  info: 'photo 5'
}];




var newArray = [{
  id: 1,
  name: 'name1',
  guid: '6d670044-9d3e-4c48-ba2b-5ec3e0c6be0f'
}, {
  id: 2,
  name: 'name2',
  guid: 'f2afa8a9-6666-44d5-b360-8e7b8fb27c2e'
}, {
  id: 3,
  name: 'name3',
  guid: '66fc9e12-1c0a-447c-81c8-2f3a4bf0608c'
}, {
  id: 4,
  name: 'name4',
  guid: '27e910cf-ba4c-412c-9faf-e7db5f058639'
}, {
  id: 5,
  name: 'name5',
  guid: '24c2b868-8f4d-4113-a537-f8e7f57bb88b'
}];

var obj = {};

MainArray.forEach(function(v, i) {
  obj[v.guid] = i;
});

newArray.sort(function(a, b) {
  return obj[a.guid] - obj[b.guid];
});

console.log(newArray);

Upvotes: 1

Related Questions