2015-11-25 7 views
1

У меня есть этот код яваскрипта, используя jQuery.extend:Почему этот рекурсивный вызов jQuery.extend не работает?

hash1 = {"/":{"programme-nav":true}}; 
hash2 = {"/":{"what-is-scheme":true}}; 
merged = $.extend(hash1, hash2); 
deep_merged = $.extend(true, hash1, hash2); 
//expected_deep_merged = {"/":{"programme-nav":true, "what-is-scheme":true}}; 
console.log("merged = "+JSON.stringify(merged)); 
// gives {"/":{"what-is-scheme":true}}; 
console.log("deep_merged = "+JSON.stringify(deep_merged)); 
// also gives {"/":{"what-is-scheme":true}}; 

Согласно API (https://api.jquery.com/jquery.extend/), передавая true в качестве первого аргумента будет рекурсивно объединить объекты. В этом случае я ожидаю получить результат в комментарии. Но, я получаю то же самое, что и в случае, если я делаю не глубокие расширения.

Я установил jsfiddle для этого здесь, который выводит на консоль https://jsfiddle.net/0725apqn/2/, чтобы вы могли играть.

Может кто-нибудь объяснить, где я иду не так? спасибо, Макс

EDIT: Я идиот. Передача true, поскольку первый аргумент делает глубокое слияние правильно, но я не заметил, что я уже перезаписал hash1 в первой части моего примера (где я делаю не глубокое слияние), так что когда я пришел к «глубокому» слиянию, я фактически делал это:

deep_merged = $.extend(true, {"/":{"what-is-scheme":true}}, {"/":{"what-is-scheme":true}}); 

Массивный «дох». спасибо всем, кто читал это. Я собираюсь присудить как можно больше очков, а затем удалить этот вопрос.

+1

Я даю вам +1 для редактирования :) –

ответ

5

Расширение не создает копию вашей структуры данных, оно изменяет значение, переданное в качестве первого аргумента, которое возвращается методом.

Пройдите первый звонок, чтобы включить измененный 'hash1', который заканчивается тем же, что и 'hash2'.

Во втором случае вы объединяете два одинаковых хэша.

Для достижения того, к чему вы стремитесь, передайте новый экземпляр в параметрах расширения.

result = $.extend(true, {}, hash1, hash2); 

Этот вызов не изменит «hash1»

+0

Passing дополнительный пустой объект не является на самом деле нужно, увидеть мой выбор. –

+0

Не нужно - но часто удобно :) –

+2

@MaxWilliams Вам все еще нужен пустой объект, потому что иначе 'hash1' будет изменен. См. Https://jsfiddle.net/6kbm2hma/1/. Предполагая, что это не так, присвоение возвращаемого значения новой переменной, вероятно, станет источником проблем позже. – Yoshi