2016-04-04 16 views
0

私は小さな問題があります。JSON deleteはソース変数の属性も削除します

var template = data; 
delete template.candidates; 

上記のコードは、data.candidatesも削除します。 私はいくつかの他のロジックで解決することができますが。しかし、私はそれの背後にある実際の理由とこれに対する適切な解決策(回避策ではない)が必要です。デフォルト=が事前

+0

オブジェクトのコピーを作成する必要があります - ここを見てください:http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – somethinghere

+0

[Is JavaScriptの参照渡しや値渡しの言語?](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language ) – Liam

答えて

2

おかげでのみ、オブジェクトの参照を作成します。どちらのオプションでは、新しい変数にオブジェクトを複製します

var template = JSON.parse(JSON.stringify(data)); 

-

var template = Object.assign({}, data); 

ES5 - (あなたのための要件である)クローン化するために、あなたは

ES2015(ES6)を次の操作を行うことができますtemplateと呼ばれます。次の操作では、テンプレートからデータを削除するだけでdataがそのまま保持されます。

+0

ありがとう@Bikas、それは助けた –

1

これは、dataへの参照を変数templateに渡すためです。この「問題」を解決するための簡単な方法は、このような何かを行うことによって、オブジェクトのクローンを作成することです:

var template = JSON.parse(JSON.stringify(data))

0

あなたのテンプレートVARにオブジェクトのコピーを作成する必要があります。

var data = { 
 
    candidates: [1, 2], 
 
    test: [1] 
 
}; 
 
var template = data.constructor(); 
 
for (var attr in data) { 
 
    if (data.hasOwnProperty(attr)) template[attr] = data[attr]; 
 
} 
 
delete template.candidates; 
 
console.log(data, template);

1

変数にオブジェクトを割り当てると、その変数は実際にオブジェクトを「含む」わけではありません(整数の場合のように)、変数にはObje ct。 var template = dataを割り当てると、templateにはdataが実際にはコピーされません。参照先はオブジェクトtemplateにコピーされているだけです。したがって、同じObjectを参照しているため、これらの変数のいずれかを実行すると、同じObjectに影響する2つの変数があります。 だからこれを解決するには、あなたのコードデータとテンプレートで、実際にあなたに実行している問題は、可変性に問題があるdataからtemplate

0

をオブジェクトのクローンを作成することです実際には同じオブジェクトを参照し、そのために変更します一方は他方に影響を与えます。変数を変更するのではなく、何かを変更する必要がある場合は、新しいオブジェクトを返すように努力する必要があります。 Object.assign()またはスプレッド演算子を使用することをお勧めします。別の問題は、使用しているdelete関数が実際にかなり遅い、JSからオブジェクトキーを削除する適切な方法がないという事実から生じます。 Object.assign()

const jsonFunction = input => { 
    return Object.assign({}, input, candidates: null); 
} 

const data = jsonFunction(template); 

const jsonFunction = input => { 
    return { 
     ...input, 
     candidates: null, 
     ...input 
    } 
}; 

const data = jsonFunction(template); 

または代わりにこれはimmutablyそれを扱うことで、それはあなたがそれらがお互いに影響を与えずにdatatemplateに対処することができることを意味し、新しいオブジェクトを返し、データに割り当てます。

関連する問題