2017-01-03 27 views
0

外部のパートナーが私たちのためにjqueryプラグインを開発しました。 私はいくつかの設定をリセットしたいと思っていました。Jqueryディープコピーの問題を解決する

は、私はいくつかのデバッグを行なったし、次のような結果になった:

私は、彼らが$ .extend

var t = '{"config":{"filters":{"filtersPerCarousel":2,"sliders":[{"machineName":"brightness","filter":"brightness","range":100,"step":5,"value":0,"translationKey":"filter.slider.brightness"},{"machineName":"contrast","filter":"contrast","range":100,"step":5,"value":0,"translationKey":"filter.slider.contrast"}],"presets":[{"machineName":"original","filters":[],"previewImage":"/images/filters/original.png","translationKey":"filter.original"},{"machineName":"blackwhite","filters":[{"filter":"saturation","settings":[-100]}],"previewImage":"/images/filters/blackwhite.png","translationKey":"filter.blackwhite"},{"machineName":"sepia","filters":[{"filter":"greyscale","settings":[]},{"filter":"sepia","settings":[60]}],"previewImage":"/images/filters/sepia.png","translationKey":"filter.sepia"}]}}}'; 
 
var o = '{"config":{"filters":{"sliders":[],"presets":[]}}}'; 
 
settings = $.extend(true, {}, jQuery.parseJSON(t), jQuery.parseJSON(o)); 
 
console.log(settings.config);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

深いコピーISSETのディープコピーを使用していることに気づきました本当に私のconfig.slidersは変更されず、元の状態を保持します。

私は深いコピーを削除し、ちょうどなぜオブジェクトが設定されていないと、なぜそれがない深いコピーで修飾されている$ .extend

var t = '{"config":{"filters":{"filtersPerCarousel":2,"sliders":[{"machineName":"brightness","filter":"brightness","range":100,"step":5,"value":0,"translationKey":"filter.slider.brightness"},{"machineName":"contrast","filter":"contrast","range":100,"step":5,"value":0,"translationKey":"filter.slider.contrast"}],"presets":[{"machineName":"original","filters":[],"previewImage":"/images/filters/original.png","translationKey":"filter.original"},{"machineName":"blackwhite","filters":[{"filter":"saturation","settings":[-100]}],"previewImage":"/images/filters/blackwhite.png","translationKey":"filter.blackwhite"},{"machineName":"sepia","filters":[{"filter":"greyscale","settings":[]},{"filter":"sepia","settings":[60]}],"previewImage":"/images/filters/sepia.png","translationKey":"filter.sepia"}]}}}'; 
 
var o = '{"config":{"filters":{"sliders":[],"presets":[]}}}'; 
 
settings = $.extend({}, jQuery.parseJSON(t), jQuery.parseJSON(o)); 
 
console.log(settings);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

を使用するときに設定が変更されました深いコピーで修正? これは、これが逆の方法であることがより理にかなっていますか?

jqueryのバージョンは1.9.1ですが、これを複数のバージョンでテストしたところ、すべて同じ結果でした。

+0

を設定することができます。それはデザインごとです。あなたの懸念は何ですか?何が効いていないのですか? – Developer

答えて

0

hereをご覧ください。

jQuery拡張されたすべてのオブジェクトをMERGESに渡しますが、オブジェクトをオーバーライドしません。塗りつぶされたオブジェクトと空のオブジェクトを渡すと、それはマージされ、両方からすべてのデータを取得します。すべての内部データを取得するには、詳細コピーをtrueに設定する必要があります。

あなたは一部の値をリセットする必要がある場合は、あなただけ手動であなたが深いコピーのために `true`に深いコピーを設定する必要がそれらを

var t = '{"config":{"filters":{"filtersPerCarousel":2,"sliders":[{"machineName":"brightness","filter":"brightness","range":100,"step":5,"value":0,"translationKey":"filter.slider.brightness"},{"machineName":"contrast","filter":"contrast","range":100,"step":5,"value":0,"translationKey":"filter.slider.contrast"}],"presets":[{"machineName":"original","filters":[],"previewImage":"/images/filters/original.png","translationKey":"filter.original"},{"machineName":"blackwhite","filters":[{"filter":"saturation","settings":[-100]}],"previewImage":"/images/filters/blackwhite.png","translationKey":"filter.blackwhite"},{"machineName":"sepia","filters":[{"filter":"greyscale","settings":[]},{"filter":"sepia","settings":[60]}],"previewImage":"/images/filters/sepia.png","translationKey":"filter.sepia"}]}}}'; 
 

 
settings = jQuery.parseJSON(t); 
 

 
settings.config.filters.sliders = []; 
 
settings.config.filters.presets = []; 
 

 
console.log(settings);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

関連する問題