2016-07-25 5 views
0

私はd3をインタラクティブネットワークアプリケーションに使用します。私がバインドする必要があるデータは、インタラクション中に変更され、JSON変数から選択されたいくつかのオブジェクトで構成されます。
私はJSON変数にマップを使用し、適切なオブジェクトを選択するためのクエリをいくつか行いました。オブジェクトはリストにプッシュされ、このリストは新しいデータとしてバインドされます。
私の問題は、Javascriptがオブジェクトを参照としてプッシュすることです。 d3では気の利いたデータの変更が行われますが、JSON変数が乱雑になり、クエリが機能しなくなります。
JSON.stringify()またはjQuery.extend()などの各オブジェクトをコピーする必要がありますか、またはデータとして渡すオブジェクトの配列からJSON変数を切り離す別のソリューションがありますか?クローンとしてのJavascriptプッシュオブジェクト

+1

[* "JavaScriptでオブジェクトを複製する最も効率的な方法は何ですか?"](/ q/122102)をご覧ください。 'stingify()'/'parse()'を使うのはそれほど悪いことではありません。それは理想的ではなく、特別な注意を必要とするいくつかの問題がありますが、おそらく最も速い候補です。 – altocumulus

答えて

2

すべてのJSオブジェクトは、参照(オブジェクト、配列、関数など)として渡されます。

var deepCopy = JSON.parse(JSON.stringify(oldObject)) // 1. - more of a hack 
var deepCopy = _.cloneDeep(oldObject); // 2. use some predefined methods from jQuery, lodash or any other library 

var shallowCopy = Object.assign({}, oldObject) // 1. - preferred (if you support new ES features) 

このようにして、特定のオブジェクトの「ディープコピー」を作成すると、リストのデータは変更されません。

+0

'JSON.parse(JSON.stringify(oldObject))'をしないでください。本当にjsonを通ることはハックであり、励まされるべきではありません。 – WouterH

+0

これはもっとハックだと言いました –

+1

また、 'Object.assign'はES6の機能なので、まだ最新のブラウザではサポートされていません。たとえば、Internet Explorerはこの機能をまだサポートしていません。 – LordTribual

関連する問題