2017-01-03 111 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的深层副本为true我的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

你必须设置深复制到TRUE;深拷贝;那是每个设计。你在这里担心什么?什么不起作用? – Developer

回答

0

请看看here

jQuery扩展MERGES传递给它的所有对象,它不覆盖对象。如果你传递一个填充对象和一个空的对象,它将合并并获取来自两者的所有数据。要获取所有内部数据,您需要将深度复制设置为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>