Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort array containing objects based on another array [duplicate]

Possible Duplicate:
JavaScript - Sort an array based on another array of integers
Javascript - sort array based on another array

If I have an array like this:

['one','four','two']

And another array like this:

[{
  key: 'one'
},{
  key: 'two'
},{
  key: 'four'
}]

How would I sort the second array so it’s key property follows the order of the first? In this case, I want:

[{
  key: 'one'
},{
  key: 'four'
},{
  key: 'two'
}]
like image 566
David Hellsing Avatar asked Nov 22 '12 18:11

David Hellsing


2 Answers

We can use the sort() function to do this by passing it a custom function which does the comparison. This function has to return 3 possible values given a or b to compare:

return -1 if a is indexed lower than b

return 0 if a is considered equal to b

return 1 if a is indexed greater than b

With this in mind, we can define a function such as this:

function sortFunction(a,b){
    var indexA = arr.indexOf(a['key']);
    var indexB = arr.indexOf(b['key']);
    if(indexA < indexB) {
        return -1;
    }else if(indexA > indexB) {
        return 1;
    }else{
        return 0;       
    }
}

This function will take in the objects you defined in your array, and find where that value is in the arr array, which is the array you're comparing to. It then compares the index, and returns the values as needed.

We use this function by passing the function into the sort() function as such:

testArray.sort(sortFunction)

where testArray is the array you're trying to sort.

You can take a look at here, where I did this example, and you can see the second object in your array being "alerted" to you, before and after the sort function was called. http://jsfiddle.net/Sqys7/

like image 86
MysticXG Avatar answered Sep 20 '22 23:09

MysticXG


Here's my take on it:

function orderArray(array_with_order, array_to_order) {
    var ordered_array = [], 
        len = array_to_order.length,
        len_copy = len,
        index, current;

    for (; len--;) {
        current = array_to_order[len];
        index = array_with_order.indexOf(current.key);
        ordered_array[index] = current;
    }

    //change the array
    Array.prototype.splice.apply(array_to_order, [0, len_copy].concat(ordered_array));
}

Sample implementation:

var array_with_order = ['one', 'four', 'two'],

    array_to_order = [
        {key: 'one'},
        {key: 'two'},
        {key: 'four'}
    ];

orderArray(array_with_order, array_to_order);

console.log(array_to_order); //logs [{key: 'one'}, {key: 'four'}, {key: 'two'}];

The usual fiddle: http://jsfiddle.net/joplomacedo/haqFH/

like image 31
João Paulo Macedo Avatar answered Sep 19 '22 23:09

João Paulo Macedo