2016-12-04 4 views
1

ループ内で作成された別の配列内の値に配列内の文字列をコピーする必要があります。最後にすべての名前を表示すると、名前の配列の最後になります。私は参照を持っていないように、私はそれが外部ライブラリなしでネイティブのjavascriptのみになりたいと思いますので、値をコピー/複製したいです。純粋なjavascriptで配列内部のクロージャを使用する

は、これは私のコード

var exp_names =["name1","name2","name3"]; 
var i;  
for (i = 0; i < exp_names.length; i++) { 
    d3.tsv("data/"+exp_names[i], function(data) { 
     data.forEach(function(d){ 
      //Do stuff with my tsv 
      d.expId = exp_names[i]; 
     }); 
    }); 
}); 

され、その後、すべてのEXPIDは "NAME3"

データは、ファイルごとに正しくロードされています。

jqueryの拡張関数とlodashのクローン関数を試してみましたが、自分のクローン関数を試してみましたが、何も動作せず、すべてのexpIdに対して "name3"がスローされます。

これらは動作しませんでした:

var newname = new String(exp_names[i]); 
var newname = $.extend(true, {}, exp_names[i]); 
var newname = $.extend({}, exp_names[i]); 
var newname = _.clone(exp_names[i]); 
var newname = exp_names[i].slice(0); 

私は今では絶望的です。

+0

書き込みは、あなたの入力配列から予想される結果は –

答えて

1

bind機能を使用する必要があります。

var exp_names =["name1","name2","name3"]; 
var i; 
var func = [];  
for (i = 0; i < exp_names.length; i++) { 
    func[i]=(function(index){ 
     d3.tsv("data/"+exp_names[index], function(data) { 
      data.forEach(function(d){ 
       //Do stuff with my tsv 
       d.expId = exp_names[index]; 
      }); 
     }); 
    }).bind(this,i); 
} 
for(i = 0; i < 3; i++){ 
    func[i](i); 
} 

もう1つの解決策は、letキーワードを使用することです。

ES6では、このような状況に対してletキーワードが提供されています。クロージャを使用する代わりに、letを使用してループスコープ変数を設定することができます。

これを試してください:

for (let i = 0; i < exp_names.length; i++) { 
    d3.tsv("data/"+exp_names[i], function(data) { 
     data.forEach(function(d){ 
      //Do stuff with my tsv 
      d.expId = exp_names[i]; 
     }); 
    }); 
} 
+0

キーワードは非常に私を助けた「聞かせて」、どうもありがとうございましたexp_namesしてください!バインドがうまくいかなかった、ループを作っていない、おそらく私は何か間違って書きました。しかし、とにかく "let"はその日を救った。ありがとうございました! –

+0

ようこそ。 –

+0

@ZloySmiertniyは、 '.bind'メソッドを動作させる必要があります。 –

0

私は生命維持の使用状況を推測し、最初の答えに、一緒に結合し少し奇妙です。どちらか一方を選択するのが最善です。 in the newest versions of the browsers bind is way faster than an IIFE closureletのキーワードから、私はあなたにbindの方法を提案するかもしれません。

あなたの場合と同様の例があります。

var exp_names = ["name1","name2","name3"], 
 
      lib = {doStg: function(d,cb){ 
 
          cb(d); 
 
         } 
 
       }, 
 
     data = [{a:1},{a:2},{a:3}]; 
 

 
for (i = 0; i < exp_names.length; i++) { 
 
    lib.doStg(data, function(i,d) { 
 
         d.forEach(function(e){ 
 
            //Do stuff with doStg 
 
            e.expId = exp_names[i]; 
 
            console.log(e); 
 
           }); 
 
        }.bind(null,i)); 
 
}

関連する問題