2

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?

3 Answers 3

1

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);

Sign up to request clarification or add additional context in comments.

Comments

0

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]);})

1 Comment

You should never iterate an array with for (var i in MainArray). That iterates properties of an object, not only array elements. Any other enumerable properties will be included in that type of iteration. Use for (var i = 0; i < MainArray.length; i++) or use MainArray.forEach(...).
0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.