2016-12-15 12 views
1

私は2つの関数を持っています。そのうちの1つは、オブジェクトを配列にプッシュします。オブジェクトからキーを削除し、値を配列に格納する別の関数を呼び出します。Javascriptスコープでグローバル変数を設定しない

しかし、それはグローバルな配列に期待される結果を設定していないので、私は残りのコードを使用します。

 var arr1 = []; 
 
     
 
    function foo(callback){ 
 
     arr1.push({id: 1},{id: 2}); 
 
     console.log(JSON.stringify(arr1)); 
 
    
 
     callback(arr1); 
 
    } 
 
     
 
    foo(function(arr1){ 
 
     \t bar(arr1); 
 
    }); 
 
    
 
    function bar(arr1){ 
 
    \t arr1 = arr1.map(x => x.id); 
 
     console.log(JSON.stringify(arr1)); 
 
    } 
 

 
    console.log(JSON.stringify(arr1)); // I want the result to be [1,2]

私の実際のコードベースに、機能は非常に複雑なので、私は、第2の機能を無視して、最初の関数にすべてのそれの内容を置くが、それは物事が乱雑になるだろうことができます。だからこれを解決する方法はありますか?

+0

これは、それはあなたが、配列の値を渡しているので、どのように動作するかを正確に更新されるローカル変数に渡します。代わりにここで何をすべきかを知ることができます:https://jsfiddle.net/hkwg04py/ –

+0

@BrettJeffresonしかし、私は私のケースでは配列を渡す必要があります。そうでなければ、それは役に立たないです – marukobotto

+0

なぜコールバックコンセプトを使用していますか?あなたはそれらなしでそれを行うことができ、あなたのコードを簡単にし、あなたが私の下の答えに示されているようにあなたが望むものを達成することができます。 –

答えて

0

このようにjsonオブジェクトを使用すると、グローバルスコープからの「変数名」の依存関係を持たずにスコープを分離できます。

 var arr1 = {arr: []}; 
 
     
 
    function test1(callback){ 
 
     arr1.arr.push({id: 1},{id: 2}); 
 
     console.log(JSON.stringify(arr1.arr)); 
 
    
 
     callback(arr1); 
 
    } 
 
     
 
    test1(function(arr1){ 
 
     \t test(arr1); 
 
    }); 
 
    
 
    function test(arr1){ 
 
    \t arr1.arr = arr1.arr.map(x => x.id); 
 
     console.log(JSON.stringify(arr1)); 
 
    } 
 

 
    console.log(JSON.stringify(arr1.arr)); // I want the result to be [1,2]

+2

"_JavaScriptが参照によってパラメータをサポートしていない"場合、そのグローバルな 'arr1'は' test(arr1) 'によってどのように変更されますか? –

+1

あなたは正しいです、私は答えを修正します。私は「プリミティブ」と考えていましたが、この場合ではありません。文字列 –

0

それは明確ではありませんあなたのコードの閉鎖スコープであり、この5月には、将来的に問題となるが、あなたのデザインが本当にそのような決定を必要とする場合 - ここでは、実施例に

var arr1 = []; 
 
      
 
function test1(a, callback){ 
 
    a.push({id: 1},{id: 2}); 
 
    console.log('1', JSON.stringify(arr1)); 
 

 
    callback(a); 
 
} 
 

 
test1(arr1, function(a){ 
 
    test(a); 
 
}); 
 

 
function test(a){ 
 
    //better do not use, but it works 
 
    arr1 = a = a.map(x => x.id); 
 
    console.log('2', JSON.stringify(a)); 
 
} 
 

 
console.log('3', JSON.stringify(arr1)); // I want the result to be [1,2]
を取ることができますあなたのコードを作ることができないのはなぜ

0

それはグローバル変数であり、よりシンプルかつ

var arr1 = []; 
 
var arr2 = []; 
 
     
 
function test1(arr){ 
 
    arr.push({id: 1},{id: 2}); 
 
    return arr; 
 
} 
 
    
 
function test(ar){ 
 
    ar = arr1.map(x => x.id); 
 
    return ar; 
 
} 
 

 
var array1 = test(test1(arr1)); 
 
console.log(JSON.stringify(array1)); // I want the result to be [1,2] 
 

 
var array2 = test(test1(arr2)); 
 
console.log(JSON.stringify(array2)); // I want the result to be [1,2]

+0

2つ以上の配列がある場合はどうなりますか?あなたは 'test1'をどうやって書いていますか? – marukobotto

+0

あなたは複数の配列を 'test1'に渡してから、それらの中にオブジェクトを押し込んで戻し、その後の処理をしたいと言っていますか? –

+0

はい。複数の配列がある場合、どうやってそれを返しますか? – marukobotto

0

以下のような何かを行う場合は、他の関数にパラメータとして渡しても意味がありません。あなたはちょうどこれを行うことができます。

var arr1 = []; 

    function test1(callback){ 
     arr1.push({id: 1},{id: 2}); 
     console.log(JSON.stringify(arr1)); 

     callback(); 
    } 

    test1(function(){ 
     test(); 
    }); 

    function test(){ 
     arr1 = arr1.map(x => x.id); 
    } 

    console.log(JSON.stringify(arr1)); 

あなたが実際にあなたがtest()のローカルスコープに存在していたarr1の値を交換して、test()にグローバル変数arr1の値を交換していませんでした。

+0

関数が複雑で、関数内でローカル変数を使ってグローバルに設定しなければならないと言っているように、必ず渡すべき点があります。 – marukobotto

1

あなたのデザインに疑問はありません。複雑なコードを既に単純化していたように思えます。他の回答は有効な代替ソリューションを提供していますが、それは理由を説明するものではありません。

JSパラメータは「外」ではなく、大まかにCに変換されています。単純なポインタであり、ポインタへのポインタではありません。関数内のパラメータ値(mapの結果)を置き換えると、変更は関数スコープ内にとどまります。あなたは機能のうち、変更を取得したい場合は、他の回答が提案した方法のいずれかを適用します。

  • は修正戻り値を作る複合オブジェクト
  • にパラメータ・ツー・改変することをラップ - いずれかまたは単に一時的な複合オブジェクト
  • には本当に、修正、コールバックパラメータ

その周りに方法はありませんします。JSには構文がなく、outパラメータはサポートされていません。

2

JSONオブジェクトの配列を作成した後、あなたはそれがために働くだろうIDの配列を取得するには、以下のコードを書くことができます

var arr = [ {id: 1, data: "data1"}, 
       {id: 2, data: "data2"}]; 

var id_array = Object.keys(arr).map(function (k) { 
       return arr[k]['id'].toString(); 
      }); 
関連する問題