私は小さな問題があります。JSON deleteはソース変数の属性も削除します
var template = data;
delete template.candidates;
上記のコードは、data.candidates
も削除します。 私はいくつかの他のロジックで解決することができますが。しかし、私はそれの背後にある実際の理由とこれに対する適切な解決策(回避策ではない)が必要です。デフォルト=
が事前
私は小さな問題があります。JSON deleteはソース変数の属性も削除します
var template = data;
delete template.candidates;
上記のコードは、data.candidates
も削除します。 私はいくつかの他のロジックで解決することができますが。しかし、私はそれの背後にある実際の理由とこれに対する適切な解決策(回避策ではない)が必要です。デフォルト=
が事前
で
おかげでのみ、オブジェクトの参照を作成します。どちらのオプションでは、新しい変数にオブジェクトを複製します
var template = JSON.parse(JSON.stringify(data));
-
var template = Object.assign({}, data);
ES5 - (あなたのための要件である)クローン化するために、あなたは
ES2015(ES6)を次の操作を行うことができますtemplate
と呼ばれます。次の操作では、テンプレートからデータを削除するだけでdata
がそのまま保持されます。
ありがとう@Bikas、それは助けた –
これは、data
への参照を変数template
に渡すためです。この「問題」を解決するための簡単な方法は、このような何かを行うことによって、オブジェクトのクローンを作成することです:
var template = JSON.parse(JSON.stringify(data))
あなたのテンプレート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);
変数にオブジェクトを割り当てると、その変数は実際にオブジェクトを「含む」わけではありません(整数の場合のように)、変数にはObje ct。 var template = data
を割り当てると、template
にはdata
が実際にはコピーされません。参照先はオブジェクトtemplate
にコピーされているだけです。したがって、同じObjectを参照しているため、これらの変数のいずれかを実行すると、同じObjectに影響する2つの変数があります。 だからこれを解決するには、あなたのコードデータとテンプレートで、実際にあなたに実行している問題は、可変性に問題があるdata
からtemplate
に
をオブジェクトのクローンを作成することです実際には同じオブジェクトを参照し、そのために変更します一方は他方に影響を与えます。変数を変更するのではなく、何かを変更する必要がある場合は、新しいオブジェクトを返すように努力する必要があります。 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それを扱うことで、それはあなたがそれらがお互いに影響を与えずにdata
とtemplate
に対処することができることを意味し、新しいオブジェクトを返し、データに割り当てます。
オブジェクトのコピーを作成する必要があります - ここを見てください:http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – somethinghere
[Is JavaScriptの参照渡しや値渡しの言語?](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language ) – Liam