如何在 AppsScript 中拼合和转置数组

How to flatten and transpose an array in AppsScript

本文关键字:转置 数组 AppsScript      更新时间:2023-09-26

我正在尝试在AppsScript中编写一个自定义的Google电子表格函数,该函数将获取任意维度的数组("范围")并在单个列中返回唯一值。该函数采用可选参数transpose该参数应按行而不是列对输出进行排序。

我已经有了这个半工作,但transpose方法仅适用于方形数组:

function GETUNIQUES(range, transpose) {
  traspose = transpose || !0;
  if (transpose) {
    range = range.map(function(col, i) {
      return range.map(function(row) {
        return row[i];
      });
    });
  }
  
  var flat = [];
  var clean = [];
  for (i = 0; i < range.length; i++) {
    for (j = 0; j < range[i].length; j++) {
      flat.push(range[i][j]);
    }
  }
  for (i = 0; i < flat.length; i++) {
    flat[i] = String(flat[i]);
    if (flat[i].length && clean.indexOf(flat[i].trim()) < 0) {
      clean.push(flat[i].trim());
    }
  }
  return clean;
}

有人可以帮助我为遵循行顺序而不截断结果的 transpose 方法提供解决方案吗?

转置不适用于Array#map(),因为长度可能不是想要的长度。

使用Array#forEach()转置

forEach() 方法为每个数组元素执行一次提供的函数。

var range = [[0, 1], [2, 3], [4, 5]];
range = function (array) {
    var r = [];
    array.forEach(function (a, i) {
        a.forEach(function (b, j) {
            r[j] = r[j] || [];
            r[j][i] = b;
        });
    });
    return r;
}(range);
document.write('<pre>' + JSON.stringify(range, 0, 4) + '</pre>');

使用Array#reduce()转置

reduce() 方法对累加器和数组的每个值(从左到右)应用函数,以将其减少到单个值。

var range = [[0, 1], [2, 3], [4, 5]];
range = range.reduce(function (r, a, i) {
    a.forEach(function (b, j) {
        r[j] = r[j] || [];
        r[j][i] = b;
    });
    return r;
}, []);
document.write('<pre>' + JSON.stringify(range, 0, 4) + '</pre>');

来自板材产品论坛:

=ARRAYFORMULA({array1;array2;array3})

。将多个范围合并到一个仅查看列中,然后:

=UNIQUE(ARRAYFORMULA({A2:A5; B3:B7; C10}))

=TRANSPOSE(UNIQUE(ARRAYFORMULA({A2:A5; B3:B7; C10})))