2017-10-25 5 views
0

私がtempArrをシフトすると、async.eachSeriesは実際に座標をスキップします(あるいは、座標の座標も同様にシフトしているようです)。私は同じメモリ位置を持つオブジェクトを指すポインターと関係があると思いますが、どのように動作するのかという概念はありません。変数に値を代入すると、実際に何が起こっていますか?データポインタ?ある配列をシフトすると別の配列に影響するようです

私は

tempArr = _.toArray(coordinates);

代わりの

tempArr = coordinatesArr;

サンプル以下の操作を行う場合、コードは動作します:


 

 
var coordinatesArr, tempArr; 
 
    var marginLon = []; 
 
    var marginLat = []; 
 
    var coordinates = { 
 
    \t '0': { lon: 13.18472, lat: 32.88972 }, 
 
    \t '1': { lon: 13.400454, lat: 32.767144 }, 
 
    \t '2': { lon: -120.59234, lat: 47.372269 }, 
 
    \t '3': { lon: 122.065977, lat: -26.471618 }, 
 
    \t '4': { lon: 122, lat: -25 } 
 
    } 
 

 
    coordinatesArr = _.toArray(coordinates); 
 
    tempArr = coordinatesArr; 
 
    // Will work if changed to below 
 
    // tempArr = _.toArray(coordinates); 
 

 
    async.eachSeries(coordinatesArr, function(set, acb) { 
 
    \t tempArr.shift(); 
 
    \t if(tempArr.length < 1) return acb(); 
 
    \t async.eachSeries(tempArr, function(set2, aacb) { 
 
    \t \t marginLon.push(Math.abs(set.lon - set2.lon)); 
 
    \t \t marginLat.push(Math.abs(set.lat - set2.lat)); 
 
    \t \t aacb(); 
 
    \t }, function(err) { 
 
    \t \t if(err) return acb(); 
 
    \t \t acb(); 
 
    \t }); 
 
    }, function(err) { 
 
    \t if(err) return; 
 
    \t return; 
 
    });

すべての変数は、最終的にのみ、スカラ(非化合物)の値を含めることができますあなたの

+0

'_.toArrayは()'は何ですか? '.shift()'を呼び出す目的は何ですか? – guest271314

+0

_.toArray()は、オブジェクトを配列に変換するlodashライブラリからのものです。私がしようとしているのは、非同期のネストされたforループです。シフトの目的は同じ座標(すなわち座標[0]と座標[0])を比較しないためです。 – GaryH

答えて

0

ありがとうございます。しかし、これらの値の一部は、単に参照オブジェクト(例えば、オブジェクトまたはアレイへのポインタ)である。オリジナルを保持している間に変更できるデータのコピーが必要なときは、認識する必要があります。

最初の質問なぜあなたは配列で始まらないのですか?

var coordinatesArr = [ 
    { lon: 13.18472, lat: 32.88972 }, 
    { lon: 13.400454, lat: 32.767144 } // etcetera 
] 

tempArrとcoordinatesArr両方点同じ物理アレイには、一つの双方を修正変更する場合は第二に、シフトは、破壊的な操作です。

あなたはorginalに悪影響を及ぼすことはありません修正配列を作成するために、次の行のようなものが必要になります。

var tempArr = coordinatesArr.slice(); 
+0

1.私はこのセクションをより大きなスクリプトから抜き出しました。私が変数を宣言すると、そのオブジェクトが作成されていない限り、メモリ内の場所へのポインタを作成しています。 実行すると、 'var tempArr = coordinatesArr.slice 今は2つの配列をメモリに持っていますか? – GaryH

+0

はい、もう2つの配列があります。必要がなくなるまでのレコードと、縮小または変更することができるレコードの両方に頼ることができます。 –

関連する問題