1

I have an array like this

var array = [{
    order: 3,
    sub - array: [{
        order: 2
    },{
        order: 1
    }]
},{
    order: 2,
    sub - array: [{
        order: 2
    },{
        order: 1
    }]
}];​

Now I want to sort the the complete collection on the attribute order, so both the outer as well as inner arrays should get sorted based on the attribute order.

The final output should look like this.

var array = [{
    order: 2,
    sub - array: [{
        order: 1
    },{
        order: 2
    }]
},{
    order: 3,
    sub - array: [{
        order: 1
    },{
        order: 2
    }]
}];​
Matt
  • 74,352
  • 26
  • 153
  • 180
vijay tyagi
  • 2,226
  • 3
  • 20
  • 31
  • 1
    In future, please spend more time writing or formatting your post. Formatting help can be found [here](http://stackoverflow.com/editing-help) – Matt Jun 20 '12 at 12:48
  • possible duplicate of [How to sort an array of javascript objects?](http://stackoverflow.com/questions/979256/how-to-sort-an-array-of-javascript-objects) – Rob W Jun 20 '12 at 12:50
  • @jbabey structure can be any number of levels deep, sorry didn't get the accept answers part. – vijay tyagi Jun 20 '12 at 13:11

2 Answers2

4
var propertySort = function(a, b){
    return a.order > b.order ? 1 : (a.order < b.order ? -1 : 0);
    }

var reorder = function(arr){
    var l = arr.length;
    while (l--){
        if (arr[l]['sub-array']){
            reorder(arr[l]['sub-array']);
        }
    }
arr.sort(propertySort);
};

reorder(arr);

console.log(arr);

This should re-order the array for any number of nested levels.

Graham
  • 6,484
  • 2
  • 35
  • 39
1

Use Array.prototype.sort and call it on array and subsequently on each element of array with an appropriate compare function. Something like this should work:

array.sort(function (e1, e2) {
  return (e1.order - e2.order);
});

array.forEach(function(e) {
  e["sub-array"].sort(function (e1, e2) {
    return (e1.order - e2.order);
  });
});
Daniel Baulig
  • 10,739
  • 6
  • 44
  • 43