2012-02-24 5 views
2

私はproducts.originalと呼ばれるこの(サブ)オブジェクトを持っています。私は、新しいオブジェクトに抽出し新しいオブジェクトに「コピー」した後、元のオブジェクトが影響を受けるのはなぜですか?

productArrayと呼ばれる:、驚いたことに

var resultArray= [];   
resultArray = productArray.splice(0,3); 

var productArray = []; 

productArray = products.original; 

/*some calculations here*/ 

//sort the object by lowest score 
productArray.sort(function(a, b) {return a.score - b.score;}); 

は最後に、私はresultArrayと呼ばれる第3のオブジェクトへproductArrayの最初の3つのセルを抽出しますこれにより、products.originalの長さが3(スプライス)だけ減少します。どうして?これを妨げるために私は何をしますか?前もって感謝します。

+2

についてはこちらを参照してください。次の行でその変数に別の配列を代入する場合は、配列を作成して変数に代入する必要はありません。 – Quentin

答えて

2

あなたは配列をコピーせず、その配列への参照だけをコピーしました。したがって、すべての操作は元のオブジェクトに対して実行されます。 実際のクローニングにはsliceを使用してください。

productArray = products.original.slice(0); 
+0

は、コード内の.spliceとno .sliceだけを表示します。 – Sirko

+0

Touche、私のせい。 – pimvdb

2

この方法を試してみてください:javascriptオブジェクトで

productArray = products.original.slice(); 

は、参照によって渡されます。

2

splice

は、古い要素を除去しながら、新たな要素を追加し、配列の内容を変更します。

あなたはsliceをしたい:

配列の部分の1レベル深いコピーを返します

0

これはJavaScriptで予想されています。 このpostが問題の解決に役立ちます。

0

ライン

productArray = products.original; 

doesntのは、実際にproductArrayにproducts.originalコピーします。代わりに、参照をコピーします。つまり、productArrayを変更するたびに元のオブジェクトも変更されます。ネストされたオブジェクトを(深く)コピーするには、オブジェクトのメンバーを反復処理するなどの複雑な処理が必要な場合は、配列またはオブジェクト(参照によってコピーされる)かどうかを確認し、それらを反復して単純なデータをコピーしますタイプ。代わりに、コピー機能を提供するアンダースコアまたはjqueryを使用しています。並べ替え機能から判断すると、配列には数字だけが含まれているようです。この場合、sliceはそのトリックを行います。

は、あなたが `= []`を取り除く必要がありますjqueryの例(Deep) copying an array using jQuery

関連する問題