1

switch通常の switch ステートメント (つまり、case、 )のように動作しない switch ステートメントを実行する JavaScript 関数を取得しようとしていますが、breakどうすればよいかわかりません。基本的には、switch ステートメントが最後まで中断することなく、ケースに対する評価を続行することを望んでいます。いえ

function AddData(cell,totalCell) {
  var total = 0;
  switch (cell) {
    case "AUT":
      total = totalCell;
    case "FRA":
      total = total + totalCell;
    case "DEU":
      total = total + totalCell;
    case "GRC":
      total = total + totalCell;
    case "SVK":
      total = total + totalCell;
    break;
  }
  return total;
}

参考までに、これは Google スプレッドシートで使用されています。

あなたが提供できるどんな援助も大歓迎です!

編集: AddData 関数を次のように呼び出すことを期待しています: 次のAddData(A:A,B:B)ようなスプレッドシートで:

AUT  3.4
FRA  3.3
ITA  4.7
SWE  3.0
FRA  1.1
FRA  3.7
LVA  5.2

上記の場合、出力は11.5

これが役立つことを願っています。

4

1 に答える 1

1

いくつか微調整が必​​要でした。

  1. 範囲をパラメーターとして使用すると、それらは 2 次元配列としてカスタム関数に提示されます。この場合、列を渡すつもりだったので、配列は行の配列になり、各行は 1 つの要素を持つ配列になります。列の各セルにアクセスするには、次のように行を反復処理する必要があります。

    for (var i in cell) { do_something_with( cell[i][0] ) }
    

    を使用してループする方が効率的です (正しいと言う人もいます) for (var i=0; i < cell.length; i++)

  2. ケースフォールスルー - すべての国コードに対して同じことをしたいように見えるので、必要なコードブロックは 1 つだけです。(他の人が指摘したように、breakすべてのコード ブロックの後がなければ、元のコードは失敗し、最初の一致に続くすべての操作を繰り返します。)

  3. の元のコード ブロックcase "AUT"が間違っていたと思います。実際、すべての国コードを合計したいのです。

コード

function AddData(cell,totalCell) {
  var total = 0;
  for (var i in cell) {
    switch (cell[i][0]) {
      case "AUT":
      case "FRA":
      case "DEU":
      case "GRC":
      case "SVK":
        total = total + totalCell[i][0];
        break;
    }
  }
  return total;
}

問題

この関数は堅牢ではないため、何をしようとしているのかを再考する必要があります。

  • 2 つのパラメーターには暗黙的な関係がありますが、明示的な関係はありません。これにより、長さや意味が実際には一致しないというリスクが生じます。これは、代わりに複数列の範囲を入力として取り、2 つの列が一致することを保証することで改善できます。

  • ケースステートメントにあるリスト以外の国の値をどうしたいですか? 現在、他のすべては静かに無視されていますが、別の国の値が入力された場合はどうなりますか? (空白を新しい値とは異なる方法で処理する必要があるかもしれません。throw不明な国が入力された場合に処理する必要があるかもしれません)。

于 2013-05-24T14:03:39.113 に答える