Jquery扩展了深层复制问题

时间:2017-01-03 11:23:14

标签: 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>
&#13;
&#13;
&#13;

当深度复制设置为true时,我的config.sliders不会被修改并保持原始状态。

当我删除深层副本并仅使用$ .extend

时,修改了配置

&#13;
&#13;
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);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

为什么我的对象是使用未设置的深层副本进行修改的,为什么不使用深层副本修改它? 这是另一种方式更有意义吗?

jquery版本是1.9.1,但我已经在多个版本上对它进行了测试,它们都给出了相同的结果。

1 个答案:

答案 0 :(得分:0)

请查看here

jQuery扩展MERGES传递给它的所有对象,它不会覆盖对象。如果传递填充的对象和空的对象,它将合并并从两者中获取所有数据。要获取所有内部数据,您需要将深层复制设置为true。

如果您需要重置某些值,可以手动设置它们

&#13;
&#13;
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);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
&#13;
&#13;
&#13;