Jquery.extend(true, [], obj), не создавая глубокую копию
jsFiddle здесь.
Если будет выполнено глубокое копирование, выход будет "Curious George", а не "Ender Game". Как я могу сделать глубокую копию? Ответ на этот вопрос указывает, что $.extend(true, [], obj)
создает глубокую копию. Однако мой пример показывает, что это не так.
function Person(){}
Person.prototype.favorite_books = [];
var george = new Person();
george.favorite_books = ["Curious George"];
var kate = new Person();
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"];
var people = [kate, george];
var people_copy = $.extend(true, [], people);
people_copy[0].favorite_books[0] = "Ender Game";
$('#text').text(people[0].favorite_books[0]);
Решение
Я обновил jsFiddle. Оказывается, мне нужно глубоко скопировать каждый объект в массиве индивидуально , если объект является настраиваемым объектом (то есть $.isPlainObject
возвращает false).
Ответы
Ответ 1
И вот теперь ответ real:
В настоящий момент jQuery может клонировать только обычные объекты JavaScript, в то время как вы используете пользовательские. И это очевидно, так как jQuery не может знать, как точно создать новый пользовательский объект. Таким образом, это работает так, как ожидалось:
var george = {};
george.favorite_books = ["Curious George"];
var kate = {};
kate.favorite_books = ["The Da Vinci Code", "Harry Potter"];
var people = [kate, george];
var people_copy = $.extend(true, [], people);
console.log(people_copy[0].favorite_books == people[0].favorite_books);
Ссылка на код jQuery: https://github.com/jquery/jquery/blob/master/src/core.js#L305
Посмотрите, проверяет ли он jQuery.isPlainObject(copy)
или массив. В противном случае он выполняет только ссылочную копию.
Ответ 2
Вот как я это сделал после нескольких попыток:
var newArray = JSON.parse(JSON.stringify(orgArray));
Это создаст новую глубокую копию, а не мелкую копию.
Кроме того, это, очевидно, не будет клонировать события и функции, но хорошо, что вы можете сделать это в одной строке, и его можно использовать для любого короля объекта (массивы, строки, числа, объекты и т.д.).
Ответ 3
Интересно.... это не похоже на массивы глубоких копий.
Вам нужно глубоко скопировать каждый объект по отдельности.
var people_copy = [];
$.each(people,function(i,obj) {
people_copy.push($.extend(true,{},obj));
});
EDIT: Конечно, посмотрите на эту вилку скрипта OP:
http://jsfiddle.net/s2bLv/4/