Sort an array based on another array of integers
Let's say I have an array: [0,3,4,2,5,1]
.
What I want to do is sort an array such as:
["one", "two", "three", "four", "five", "six"]
So that the order corresponds to the first array.
This would be the output:
["one", "four", "five", "three", "six", "two"]
Is there an easy way to accomplish this?
Solution 1:
You can do something like this:
function getSorted(arr, sortArr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
console.log(sortArr[i], arr[i]);
result[i] = arr[sortArr[i]];
}
return result;
}
var arr = ["one", "two", "three", "four", "five", "six"];
var sortArr = [0, 3, 4, 2, 5, 1];
alert(getSorted(arr, sortArr));
Note: this assumes the arrays you pass in are equivalent in size, you'd need to add some additional checks if this may not be the case.
Solution 2:
orderedArray= function(arr,order){
return order.map(function(itm){return arr[itm]});
}
var sequence= [0, 3, 4, 2, 5, 1],arr=["one","two","three","four","five","six"]
arr=new orderedArray(arr,sequence);
/* returned value: (Array)
one,four,five,three,six,two
*/
//You can make the order an unindexed property of the array, // and call array.ordered()
Array.prototype.ordered= function(order){
var arr= this;
order=order || this.order;
return order.map(function(itm){
return arr[itm];
});
}
var arr= ["one","two","three","four","five","six"],
sequence= [0, 3, 4, 2, 5, 1];
arr.order=sequence;
arr.ordered()
/* returned value: (Array)
one,four,five,three,six,two
*/
Solution 3:
I was asked this on a phone interview. Then do it without creating another array, supposing the array is very large. I don't know if this is the answer since I wasn't able to do on the call (damn!), but here's what I came up with.
var my_obj_array = ['a', 'b', 'c', 'd'];
var my_indicies = [3, 1, 0, 2];
// desired result ['d', 'b', 'a', 'c']
var temp = {};
for (var i = 0; i < my_indicies.length; i++) {
temp[i] = my_obj_array[i]; // preserve
var j = my_indicies[i];
if (j in temp) {
my_obj_array[i] = temp[j];
delete temp[j];
} else {
my_obj_array[i] = my_obj_array[j];
}
}
http://jsfiddle.net/innerb/RENjW/