ptrn - 8 months ago 38

Javascript Question

I have an array with arrays in it, where I want to sort the outer arrays based on values in a specific column in the inner.

I bet that sounded more than a bit confusing, so I'll skip straight to an example.

**Initial data:**

`var data = [`

[

"row_1-col1",

"2-row_1-col2",

"c-row_1-coln"

],

[

"row_2-col1",

"1-row_2-col2",

"b-row_2-coln"

],

[

"row_m-col1",

"3-row_m-col2",

"a-row_m-coln"

]

];

`data.sortFuncOfSomeKind(1);`

where the object then would look like this;

`var data = [`

[

"row_2-col1",

"1-row_2-col2",

"b-row_2-coln"

],

[

"row_1-col1",

"2-row_1-col2",

"c-row_1-coln"

],

[

"row_m-col1",

"3-row_m-col2",

"a-row_m-coln"

]

];

`data.sortFuncOfSomeKind(2);`

where the object then would look like this;

`var data = [`

[

"row_m-col1",

"3-row_m-col2",

"a-row_m-coln"

],

[

"row_2-col1",

"1-row_2-col2",

"b-row_2-coln"

],

[

"row_1-col1",

"2-row_1-col2",

"c-row_1-coln"

]

];

Is there an existing solution to this that you know of, or would I have to write one myself? If so, which would be the easiest sort algorithm to use? QuickSort?

_L

Answer

`Array#sort`

(see section 15.4.4.11 of the spec, or MDC) accepts an optional function parameter which will be used to compare two entries for sorting purposes. The function should return -1 if the first argument is "less than" the second, 0 if they're equal, or 1 if the first is "greater than" the second. So:

```
outerArray.sort(function(a, b) {
var valueA, valueB;
valueA = a[1]; // Where 1 is your index, from your example
valueB = b[1];
if (valueA < valueB) {
return -1;
}
else if (valueA > valueB) {
return 1;
}
return 0;
});
```

(You can obviously compress that code a bit; I've kept it verbose for clarity.)