2017-03-05 11 views
-1

この質問はここで数回現れていますが、私のところは少し異なります。私はJavaScriptを初めて使っています。これは問題を示す基本的なプログラムです。JavaScriptルーチンから返される複数の配列を取得する方法

var iterations = 0; 

function someFunc(x, y, z) { 

    for (var i=0; i<4; i++) { 
     x[i] = x[i] * 2; 
     y[i] = y[i] * 2; 
     z[i] = z[i] * 2; 
    } 

    iterations++; 

    if (iterations >= 10) 
     return {done:true, x, y, z}; 
    else 
     return {done:false, x, y, z}; 

} 

function main() { 

    var x = [0, 0, 0, 0]; 
    var y = [1, 1, 1, 1]; 
    var z = [2, 2, 2, 2]; 


    done = false; 
    while (!done) { 

     let {done, x, y, z} = someFunc(x, y, z); 
     console.log(x, y, z); 

     // Do some other stuff with x,y,z here, 
     // like calling anotherFunc(x, y, z) 

    } 
} 


main(); 

someFuncを呼び出すとエラーが発生します。エラーは「例外が発生しました:参照エラー:xが定義されていません」です。

私がやっていることは、ループのたびにいくつかの配列を更新する関数を呼び出すことです。これらの配列を 'someFunc'という関数から取り出すことができるようにする必要があります。そうすれば、それらを別の関数に渡して他の作業を行うことができます。

私はそれらを再び最初の機能に戻す必要があります...終了するまでループの回りを回ります。

私は

a, b, c = someFunc(a, b, c) 

のように呼び出すのPythonから来ているが細かいです。

しかし、私はJavaScriptをどのように進めるのか分かりません。どんな助けでも大歓迎です。私の質問が完全にはっきりしていないかどうかを明らかにしてください。

+0

たらvairableを宣言する必要がありますか? – Li357

+0

注目すべき点の1つは、2番目の関数で 'x、y、z'変数を' var'で宣言することで関数に適用しますが、最初の関数では 'x、y 、z'を効果的にグローバルスコープにキャストします。これはあなたの問題には関係しないかもしれませんが、グローバル名前空間でこれらが利用できるようにするつもりでない限り、最初の関数に 'var'をつけることをお勧めします。 –

+0

@Andrew Li:SomeFuncで変更されているため、値が必要です。 – davo36

答えて

0

データオブジェクトを渡すと、戻りコードを必要とせずにオブジェクトの値を変更することができます。

var iterations = 0; 

function someFunc(obj) { 

    for (var i = 0; i < 4; i++) { 
     obj.x[i] = obj.x[i] * 2; 
     obj.y[i] = obj.y[i] * 2; 
     obj.z[i] = obj.z[i] * 2; 
    } 

    iterations++; 

    if (iterations >= 10) 
     obj.done = true; 
    else 
     obj.done = false; 

} 

function main() { 

    var objectOfData = { 
     x: [0, 0, 0, 0], 
     y: [1, 1, 1, 1], 
     z: [2, 2, 2, 2], 
     done: false, 
    }; 

    while (!objectOfData.done) { 

     someFunc(objectOfData); 
     console.log(JSON.stringify(objectOfData)); 
     // Using stringify, as console.log() is async 

     // Do some other stuff with x,y,z here, 
     // like calling anotherFunc(x, y, z) 

    } 
} 

また、あなただけなぜあなたはすぐに渡された引数を再割り当てしているvar, let, etc

+0

こんにちは、ありがとう、これは動作します。 – davo36

+0

@ davo36ようこそ –

0

関数の値を識別子に設定し、次に非構造化割り当てを使用してプロパティをグローバルに設定し、プロパティを取得します。

let props = someFunc(x, y, z); 
({done, x, y, z} = props); 
console.log(x, y, z); 
+0

FYIこれは、letで再宣言していないため、スコープでブロックされていないためアクセスできます。アクセスしようとすると初期化されません。これは、既存の関数スコープのvar変数を再割り当てします。 – Li357

+0

@AndrewLi OPはとにかく変数を再宣言してはいけません。 – niceman

+0

@niceman私は彼らが答えなければならないと言ったことは一度もありません。 – Li357

関連する問題