如何在AppsScript中展平和转置数组

时间:2016-02-20 22:00:47

标签: javascript arrays google-apps-script google-sheets

我尝试在AppsScript中编写自定义Google Spreadsheets功能,该功能将采用任意维度的数组("范围")并在单个列中返回唯一值。该函数采用可选参数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;
}
&#13;
&#13;
&#13;

有人可以帮我解决行顺序后面的transpose方法而不截断结果吗?

2 个答案:

答案 0 :(得分:1)

转置不适用于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>');

答案 1 :(得分:1)

来自Sheets Product Forum

  

=ARRAYFORMULA({array1;array2;array3})

...将在一个仅查看列中合并多个范围:

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

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