试图回答 this question,我发现了一种奇怪的行为。
这是我的代码:
function remove(val, array){
var res = new Array();
for(var i=0; i<array.length; i++){
if(array[i] != val){
res.push(array[i]);
}
}
return res;
}
//we assume that there is no duplicates values inside array1 and array2
function my_union(array1, array2){
var longuer;
var shorter;
var arrayRes = new Array();
if(array1.length < array2.length){
longuer = array2;
shorter = array1;
} else {
longuer = array1;
shorter = array2;
}
for(var i=0; i<longuer.length; i++){
arrayRes.push(longuer[i]);
shorter = remove(longuer[i], shorter);
}
for(var i=0; i<shorter.length; i++){
arrayRes.push(shorter[i]);
}
return arrayRes;
}
function test(){
Browser.msgBox(my_union([1,2,3], [1,2]));
}
消息框清楚地显示1,2,3,但是当您尝试在具有相同值的电子表格中调用此函数时,它无法删除重复的值,为什么?
**编辑:** 感谢Henrique的回答,这是代码:
function remove(val, array){
var res = new Array();
for(var i=0; i<array.length; i++){
if(array[i] != val){
res.push(array[i]);
}
}
return res;
}
function matFlattener(matrix){
var array = new Array();
for(var i=0; i<matrix.length; i++){
for(var j=0; j<matrix[i].length; j++){
array.push(matrix[i][j]);
}
}
return array;
}
function my_union(matrix1, matrix2){
//assert no duplicate values in matrix1 and matrix2
var longuer;
var shorter;
var array1 = matFlattener(matrix1);
var array2 = matFlattener(matrix2);
var arrayRes = new Array();
if(array1.length < array2.length){
longuer = array2;
shorter = array1;
} else {
longuer = array1;
shorter = array2;
}
for(var i=0; i<longuer.length; i++){
arrayRes.push([longuer[i]]);
shorter = remove(longuer[i], shorter);
}
for(var i=0; i<shorter.length; i++){
arrayRes.push([shorter[i]]);
}
return arrayRes;
}
答案 0 :(得分:1)
当您从电子表格调用自定义函数并传递多范围参数时,无论您传递单行还是列,此参数都始终为矩阵。
要测试电子表格的行为,您应该像这样更改test
函数:
function test() {
//note the "extra" brackets
Browser.msgBox(my_union([[1,2,3]],[[1,2]]); //passing "single" rows
Browser.msgBox(my_union([[1],[2],[3]],[[1],[2]]); //passing "single" columns
}
解决方案是调整您的my_union
公式以对其进行说明。