basically first find the shared part of the keys, then the endings, after sort reassamle the array. the result is numerical orderd if number otherwise the order is maintained.
var dict = {
'column3': [7, 8, 9],
'column2': [4, 5, 6],
'column1': [1, 2, 3]
},
keys = Object.keys(dict),
samePart = keys.reduce(function (a, b) {
var i = 0, l = Math.min(a.length, b.length);
while (i < l && a[i] === b[i]) { i++; }
return a.substr(0, i);
}),
otherPart = keys.map(function (e) { return e.slice(samePart.length); }).sort(function (a, b) { return a - b; }),
transposedMatrix = [].map.call(otherPart, function (col, i) { return dict[samePart + col].map(function (_, j) { return dict[samePart + col][j]; }); });