2016-02-20 118 views
1

數組我試圖寫在AppsScript定製的谷歌電子表格功能,將採取任意尺寸的陣列(「範圍」),並在單個列返回唯一值。該函數有一個可選參數transpose應該排序行,而不是列的輸出。如何扁平化和轉在AppsScript

我有了這個半的工作,但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方法的解決方案行順序,但不截斷結果?

回答

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

Sheets Product Forum

=ARRAYFORMULA({array1;array2;array3})

...將在一個視圖中,僅列合併多個範圍的N:

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

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