0

この質問に答えようとして いるときに、奇妙な動作を見つけました。

これが私のコードです:

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's answer のおかげで、コードは次のとおりです。

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;
}
4

1 に答える 1

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解決策は、それを考慮して数式を調整することです。

于 2012-05-29T14:18:47.173 に答える