2017-01-03 1 views
0

외부 파트너가 jquery 플러그인을 개발했습니다. 몇 가지 설정을 재설정하고 싶었지만 작동하지 못했습니다.Jquery deep copy issue

나는 몇 가지 디버깅을했고, 다음과 같은 결과에 온 :

나는 그들이 $ .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>