2017-01-03 3 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>

Смежные вопросы