2017-04-30 2 views
1

distances.slice()を使用した後、私はそのアレイのコピーを持っていると思います。しかし、私が新しいコピーの要素を変更すると、それは元の配列を変更します。どうして?スライスを使用しているアレイコピーが機能していない

var distances = [ 
 
    ['-1', '10', '-1', '31'], 
 
    ['10', '-1', '10', '-1'], 
 
    ['-1', '-1', '-1', '10'], 
 
    ['15', '6', '-1', '-1'] 
 
]; 
 
for (var i = 0; i < 4; i++) { 
 
    console.log(distances, 'distances pairstop'); 
 
    var sampleDistance = distances.slice() 
 
    sampleDistance[0][2] = ['fooo'] 
 
}

+0

'slice'は浅いコピーのみを扱います – adeneo

答えて

2

スライスアレイの浅いコピーを生成します。

スライス()メソッドは、(端部が含まれていない)終了し始めるから選択された新たな配列オブジェクトに配列 の部分の浅いコピーを返す: それはdocsになると言います。 元の配列は変更されません。 distancesので

はarryasの配列であり、sampleDistanceは、同じ3(1次元)アレイにreferncesを保持する意味、浅いコピーであろう。 sampleDistance[0][2] = ['fooo']は、sampleDistancedistancesの両方で参照される最初の1次元アレイを変更します。

あなたのバグ。

+0

深いコピーを実現するには、' var sampleDistance = distances.map(x => x.slice()) ' –

0

不確定な深さのサブ配列項目を持つ配列を複製するには、次のような一般的な配列複製ツールが必要です。

Array.prototype.clone = function(){ 
    return this.map(e => Array.isArray(e) ? e.clone() : e); 
}; 

だからdistances.clone()は仕事をうまくやらなければなりません。

関連する問題