2012-04-03 15 views
0

FOR LOOP内の関数を呼び出そうとしています。渡されるデータの名前を除いてフォーマットは同じであるためです。私はforループ内の関数の呼び出し

var data1 = [12, 45, 30, 80]; 
var axis1 = ['15 Jan', '22 Jan', '29 Jan', '5 Feb']; 

var data2 = [89, 45, 30, 80]; 
var axis2 = ['15 Jan', '22 Jan', '29 Jan', '5 Feb']; 

for(var i = 1; i <= 2; i++){ 
    renderCharts("data"+i, "data"+i, "mainchart"+i) 
} 

そのが動作していないいくつかの理由をやって何

renderCharts(data1, axis1, 'mainchart1'); 

+1

あなたは、先生がどのようなエラーが出ていますか? –

答えて

2

あなたは変数ではなく文字列を渡しています。あなたは機能が動作する場合は、への関数呼び出しを変更:

renderCharts(window['data'+i],window['axis'+i],'mainchart'+i); 

または変数がグローバルスコープで宣言されていない場合は、ウィンドウを交換

2

最初の例のように、2つのデータオブジェクトと文字列を渡しているようですが、ループ内で3つの文字列とデータオブジェクトを渡しています。私はjavascriptを使用するとevalなどを使用する必要がありますforループの繰り返しごとにdata(n)というデータオブジェクトを渡したかった

1

あなたは必要な変数ではなく関数に文字列を渡します。

2

はこれを試してみてください:

var data = [ 
      [12, 45, 30, 80], 
      [89, 45, 30, 80] 
      ]; 
var axis = [ 
      ['15 Jan', '22 Jan', '29 Jan', '5 Feb'], 
      ['15 Jan', '22 Jan', '29 Jan', '5 Feb'] 
      ]; 

//for(var i = 1; i <= 2; i++){ <== array index starts with 0 
for(var i=0;i<data.length;i++) 
{ 
    renderCharts(data[i], axis[i], "mainchart"+i) 
} 

あなたが実際に機能への2つの異なる変数-コンボを渡しますが、それぞれの名前の文字列されていません。したがって、関数は必要なデータを実際には取得せず、変数名だけを取得します。

上記のような配列に保持するようにデータを変換するか、その他の回答の手法を使用して、window[]オブジェクトを介して変数を参照します。

わかりやすくするために、アレイ手法が好ましいはずです。

+0

なぜアレイのアプローチが優先されるべきですか?なぜJavaScriptの本質的な性質に頼ってはいけないのですか?角括弧を使ってウィンドウオブジェクトからプロパティ値を取得する方法 –

+0

@EliasVanOotegem一般的に私は1つのオブジェクトにグループ化された同様のデータを持つことをお勧めします。主にわかりやすくするためです。一方、コードや他のライブラリの他の部分と矛盾しないように、グローバルスコープ上に可能な限り少ない変数を持たせることをお勧めします。最後に、ここでは非常に小さなパフォーマンス上の利点がありますが、ここでは無視してください。 – Sirko

+0

私はあなたが今どこから来ているのかを見ることができますが、あなたのアプローチでは、この場合にすべてのデータをハードコーディングするか、少なくともこれらの変数をグローバルスコープで構築することを暗示していませんか?もしデータと軸の変数の配列/オブジェクトが異なるオブジェクト/関数/イベントハンドラで使われて生成されていれば、それらはすべてメインデータ変数を再構築する必要があるか、グローバルスコープを参照する必要がありますその場合、window ['data'](またはwindow.data)の構文がもう一度便利になります –

1

evalをあなたの引数に入れようとしましたか?ここでは文字列の引数のみを与えるためです。

for(var i = 1; i <= 2; i++){ 
    renderCharts(eval("data"+i), eval("axis"+i), "mainchart"+i) 
} 
+0

eval is EVIL ... window ['data' + i]は文字列を変数名として評価します。また、 'mainchart + i'は文字列で、evalでなければならず、' undefined'エラーの世界に入ります。推論は正しかったが、このソリューションはno-no –

+0

ですが、「メインチャート」については編集しましたが、なぜevalがEVILですか? –

+0

"eval is evil eval関数(およびその親近関数、setTimeout、setInterval)は、JavaScriptコンパイラへのアクセスを提供しますが、これは必要な場合もありますが、ほとんどの場合、非常に不正なコーディングが存在することを示します。 JavaScriptのもっとも悪用されている機能だ」 - クロフォード。これは典型的な例です。経験則:代替案がある場合は評価を使用しないでください(私の答えをチェックしてください、代替案があります)。 Googleの評価は記事のトンのためにも悪いです –

関連する問題