如何转置/旋转多维数组?

13

我正在尝试创建一个函数,接受任何数组并将其转置,使行变为列,列变为行。

不确定我做错了什么或者遗漏了什么,但是一旦通过数组传递,就会收到这个消息...

TypeError: 无法将未定义的属性"0.0"设置为"xxxxxx"。

错误出现在这一行

result[row][col] = array[col][row]; // Rotate
任何指针都将不胜感激。
function transposeArray(array){
        var result = [];
        for(var row = 0; row < array.length; row++){ // Loop over rows
          for(var col = 0; col < array[row].length; col++){ // Loop over columns
            result[row][col] = array[col][row]; // Rotate
          }
        }
        return result;
    }

6个回答

23

我个人最喜欢的是这个代码片段

function transpose(a)
{
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}

5

你需要最初将一个数组对象分配给外部结果数组中的每个元素。也许有更有效的方法,但我的想法是:

function transposeArray(array){
  var result = [];
  for (var col = 0; col < array[0].length; col++) { // Loop over array cols
    result[col] = [];
    for (var row = 0; row < array.length; row++) { // Loop over array rows
      result[col][row] = array[row][col]; // Rotate
    }
  }
  return result;
}

1
我已经找到了这种方式:

function onOpen() {

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("SEGUNDOA2E");
    var notas = sheet.getRange("G6:AK6").getNotes();

    for (var i = 0; i < 31; i++){
        var nota = notas[0][i];
        var conceptos = sheet.getRange(37+i,7).setValue(nota);
    } 
}

希望这可以帮到你。

1

AdamLMogsdad的解决方案很棒,但为了完整起见,我想分享在发现这个问题之前我想出的另一个解决方案:

function transpose2DArray(a)
{
  return Array(a).map(r=> r.map(cell => cell[0]))
}

我发现在使用这个设置转置值的时候可以起作用:

var a2 = []
a2[0] = a
sheet.getRange(1, 1, a2.length, a2[0].length).setValues(arr2)
// or
//sheet.getRange(1, 1, a[0].length, a.length).setValues(Array(a))

实际上将只有一个元素的数组放入单元格中。我的函数使用相同的技巧,但还将2D数组的元素(即只有一个元素的数组)转换为它们的内部元素(因此删除了嵌套级别)


0

我用request函数公式解决了这个问题:

  var RanMar = HojaResp.getRange("H1:X1"); // Se establece rango para las marcas de cemento.
  var Rango2 = HojaInfo.setActiveCell("B3"); // Temporal
  Rango2.setFormula('=transpose(Respuestas!H1:X1)');

不按常规,但对我来说很实用。


0

如果可以的话

x = [1, 3]

它将返回:

1
3

如果您希望它返回

1 3

您应该这样做:[[1, 3]]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接