2016-10-13 9 views
-2

Вопроса 1. Я задавался вопрос, почему
Клона «суб-массив» из массива объектов (где объекты глубоко вложенные)

JSON.parse(JSON.stringify(obj.slice(1, 3))) and 
obj.slice(1,3) 

дает одинаковый вложенный массив объектов, как объем производство, так как obj.slice(1,3) не допускается правильно клонировать вложенные объекты?

Вопрос 2. Является ли JSON.parse(JSON.stringify(obj.slice(1, 3))) правильным способом глубокого клонирования подматрицы?

OBJ детали -

var obj= [{ name: "wfwfwfw.)csdfsd", 
     tags: [ "dfbdf>>sfdfds", "fsdfsdf&fsfd" ], 
     newer: { first: "this'one", second: ["that>.one", "another.'one"], third: {something: "some/>fded", newthing: "ddasd..>sqw"}  }, 
     final: [ {gh: "ty/fgfg", hj: "rt((ssds"}, {gh: "dqqq...g", hj: "gnm))s"} ] 
}, 
{ name: "wfwfwwwwwwfw.)csdfsd", 
     tags: [ "dfbdf>>sfdfds", "fsdfsdf&fsfd" ], 
     newer: { first: "this'one", second: ["that>.one", "another.'one"], third: {something: "some/>fded", newthing: "ddasd..>sqw"} }, 
     final: [ {gh: "ty/fgfg", hj: "rt((ssds"}, {gh: "dqqq...g", hj: "gnm))s"}] 
}, 
{ name: "aa.)csdfsd", 
     tags: [ "dfbdf>>sfdfds", "fsdfsdf&fsfd" ], 
     newer: { first: "this'one", second: ["that>.one", "another.'one"], third: {something: "some/>fded", newthing: "ddasd..>sqw"} }, 
     final: [ {gh: "ty/fgfg", hj: "rt((ssds"}, {gh: "dqqq...g", hj: "gnm))s"}] 
}, 
{ name: "nn.)csdfsd", 
     tags: [ "dfbdf>>sfdfds", "fsdfsdf&fsfd" ], 
     newer: { first: "this'one", second: ["that>.one", "another.'one"], third: {something: "some/>fded", newthing: "ddasd..>sqw"} }, 
     final: [ {gh: "ty/fgfg", hj: "rt((ssds"}, {gh: "dqqq...g", hj: "gnm))s"}] 
}] 
+0

'obj.slice (1,3) и' JSON.parse (JSON.stringify (obj.slice (1, 3))) 'дают тот же результат, потому что они делайте то же самое. Достаточно времени, чтобы добраться туда. – Tibrogargan

+0

Означает ли это, что obj.slice (1,3) можно использовать для объектов глубокого клонирования? – vjjj

+0

No slice - это просто копирование ссылок. Ссылки в результате, возвращаемые 'obj, slice', являются теми же, что и в' obj'. 'JSON.stringify' создает строки из ваших объектов, тогда' JSON.parse' превращает строку в новые объекты с одинаковой структурой. Вы получаете тот же результат, что и копии.Невозможно рассказать им обособленно (за исключением того, что у них разные адреса в памяти, т. Е. Используя ===) – Tibrogargan

ответ

0

Почему это должно иметь значение, если вы JSON.parse(JSON.stringify()) результат obj.slice(1, 3), или нет? Это то, что происходит в примере 1.

Вы получаете obj.slice(1, 3), и вы получаете то же значение, прошедшее через стробирование/разбор.

Функционально, это похоже на:

var foo = 'bar'; 
 
console.log(foo); 
 
console.log(JSON.parse(JSON.stringify(foo)));

Что касается вопроса 2:

Yeap.

obj.slice не может быть использован для клонирования объектов. Он просто копирует содержимое содержимого массива. В этом случае, это содержание лишь указатели на существующие объекты:

var a = [{foo: 'bar'}, {x: 'y'}]; 
 
var b = a.slice(0,1) 
 

 
console.log('B:', b); 
 

 
b[0].foo = 'test'; 
 

 
console.log('After modification:'); 
 
console.log('A:', a); 
 
console.log('B:', b);

Как вы можете видеть, редактирование foo на b также изменяет его на a, потому что оба массива содержат указатели на такой же объект.

Вот почему вам нужен JSON.parse(JSON.stringify()).

+0

Итак, каков был бы лучший способ клонировать суб-массив объектов? – vjjj

+0

'JSON.parse (JSON.stringify' является самым простым. Лучшим? Это спорно ... – Cerbrus

+0

Но JSON.parse (JSON.stringify (OBJ)) будет клонировать весь массив. Что делать, если я хотел клонировать только OBJ [0 ], obj [1], obj [2] в новый массив? – vjjj

-1

Array.slice() не выполняет глубокое копирование, поэтому его не подходит для многомерных массивов.

Метод расширения jQuery выполняет глубокую копию, когда истинное значение передается как начальный аргумент.

// Deep copy 
var newArray = jQuery.extend(true, [], oldArray); 

аналогично сообщению here