Подтвердить что ты не робот

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).

4b9b3361

Ответ 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/