2017-12-30 13 views
-1

多次元配列(myArray)からランダムな項目を選択し、新しい変数(myTempArray)に保存し、最初の項目をID番号で更新する関数を記述しようとしています)。Javascriptスライスで古い値を更新する

mytempArray [0] [0] [0]の値を変更すると、myArrayの同等の値も更新されます。私はこれらの値を変えたくありません。

どうやってこれをやめるのですか?スライスが間違った方法を使用していますか?もしそうなら、私はそれを変更して他の場所で使うことができるように元の配列エントリをどのように複製するのですか?以下のコードは次のとおりです。

var myArray = [ 
[[0, "Description 1", 0, 0, 1, 6, 0, 0, 0, true, 0]], 
[[0, "Description 2", 0, 0, 1, 6, 0, 0, 0, true, 0]], 
[[0, "Description 3", 0, 0, 1, 6, 0, 0, 0, true, 0]], 
]; 

function randomNumber (min, max) { 
return Math.floor((Math.random() * max) + min); 
}; 

counter = 1; 

function myfunction(){ 

myrand = randomNumber(0,myArray.length-1); 
mytempArray = myArray.slice(myrand,myrand+1); 
mytempArray[0][0][0] = counter; 
counter++; 
}; 

myfunction(); 
+0

配列は参照型です。 'slice'は浅いクローンのみを行い、ネストされた配列は参照によって新しい配列にコピーされます。 –

+1

ディープ・コピー・アレイの方法をここで見てください。 https://stackoverflow.com/questions/597588/how-do-you-clone-an-array-of-objects-in-javascript – MynockSpit

+0

'Object.assign()'以外にも '... [] 'スプレッド演算子。 –

答えて

0

sliceだけで、あなたの構造の1つのレベルで動作することを覚えておいてください。 の深いコピーが必要な場合は、それを自分で実装する必要があります。

function myfunction() { 
    var myrand = randomNumber(0, myArray.length - 1); 
    var mytempArray = myArray.slice(myrand, myrand + 1); // <== Only copies one level 
    mytempArray[0] = mytempArray[0].slice();    // <== Copy the next 
    mytempArray[0][0] = mytempArray[0][0].slice();  // <== And the next 
    mytempArray[0][0][0] = counter; 
    // Presumably do something with `mytempArray` or return it 
    counter++; 
} 

私がそこで行ったいくつかの変更については以下を参照してください。


サイドノートのカップル:

  • あなたはどこかにあなたが、あなたのコードが* The Horror of Implicit Globalsに獲物を落下されることが示されていないmyrandmytempArrayを宣言している場合を除き。変数を宣言してください。
  • 関数の宣言(関数の式ではなく)の末尾に;は必要ありません。 ;は、文のターミネータです。宣言はステートメントではありません。

* (それは私の貧血の小さなブログの記事です)

+0

データが有効なJSONであると仮定すると、 'var deepCopy = JSON.parse(JSON.stringify(oldArray));'。 –

+0

@ JaredSmith:データをコピーするために 'stringify' +' parse'を使うのはいくつかのレベルで間違っていると強く信じています。 :-) –

+0

まあ、汎用的な代替は、再帰的にデータ構造をコピーすることです。 JavaScriptではトランポリングを行うか、メモリが足りなくなるのを避けるために明示的なスタックを保持することを意味します。あるいは、特定のデータ構造に対して、重複やバグの可能性があるだけの万有のバージョンを書くこともできます。私はあなたがそれをどのようにスライスしても、それが「正しい」とは思わないと思います。 –

関連する問題