-
-
Save femto113/1784503 to your computer and use it in GitHub Desktop.
function transpose(a) | |
{ | |
return a[0].map(function (_, c) { return a.map(function (r) { return r[c]; }); }); | |
// or in more modern dialect | |
// return a[0].map((_, c) => a.map(r => r[c])); | |
} |
Your gist turned up as my first google hit so I thought I would add more coffee: found this on rosetta code (http://rosettacode.org/wiki/Matrix_transposition#CoffeeScript). Note that each map() call costs a function call. Not sure when eliminating a couple of function calls would be significant...
transpose = (matrix) ->
(t[i] for t in matrix) for i in [0...matrix[0].length]
ES6 version:
transpose = a => a[0].map((_, c) => a.map(r => r[c]));
(edited, was missing the [0] before the first map)
👍
thanks! and ES6 version looks neat!
Hmm... a[0].map
? What about empty arrays?
lubien's ES6 version works correctly only for square matrix.
The solution I suggest does not rely on any specific part of the matrix (which could crash the code) nor contains itself within (making use of dot notation easier):
transpose = matrix => matrix.reduce(($, row) => row.map((_, i) => [...($[i] || []), row[i]]), [])
transpose([[0, 1], [2, 3], [4, 5]]) // [[0, 2, 4], [1, 3, 5]]
@tatomyr empty arrays (or non-2-dimensional arrays) a legit concern for a library method, not sure if it's important for a one liner. Probably best dealt with something like this
function transpose(a)
{
return a && a.length && a[0].map && a[0].map(function (_, c) { return a.map(function (r) { return r[c]; }); }) || [];
}
Nice gist!
Thank you!