2014-12-23 5 views
0

Когда я создал срез объектов с содержимым массива, новый массив все еще имеет ссылки на объекты в исходном массиве. Как сделать фрагмент с копиями объектов?Срезать массив с объектами и получить массив с копиями объектов

var obj1 = {name: 'object1'}; 
var obj2 = {name: 'object2'}; 
var array = [obj1, obj2]; 
var arraySlice = array.slice(0, 1); 
arraySlice[0].name = 'object1RENAMED'; 
console.log(array[0].name); 
console.log(arraySlice[0].name); 

http://jsfiddle.net/eqgj873h/

Печать:

object1RENAMED 
object1RENAMED 

ответ

1

В нашем случае у вас есть те же ссылки на значения (значения являются объектами), поэтому вы можете изменять значения в разных массивах. Вам нужно создать глубокий клон/копировать:

var arraySlice = JSON.parse(JSON.stringify(array.slice(0, 1))); 

Если вы используете JQuery вы можете сделать это, как этот

var arraySlice = $.extend(true, [], array.slice(0, 1)); 

Demo: http://jsfiddle.net/eqgj873h/2/

1

Вы делаете неполную копию массива , а не глубокую копию, поэтому оба массива по-прежнему относятся к тем же объектам. Вам также нужно клонировать объекты.

var arraySlice = JSON.parse(JSON.stringify(array.slice(0, 1))); 

Я взял этот клонирования код из

What is the most efficient way to deep clone an object in JavaScript?

+0

Спасибо за ссылку! – user1561346

0

Вот рекурсивная функция (cloneObj), которые могут сделать вашу жизнь проще. Он использует Array.map для клонирования объектов в пределах Array на всех уровнях.

var array = [{name: 'object1'}, {name: 'object2'}]; 
 
Helpers.log2Screen('array initially:<br>'+Object.print(array)); 
 

 
var arraySlice = cloneObj(array); 
 

 
// change names in clone: 
 
arraySlice[0].name = "changed"; 
 
arraySlice[1].name = "DEMO"; 
 
arraySlice[1].addedProp = [{a: 1, b: 2}, {a: 2, b:3}]; 
 

 
Helpers.log2Screen('arraySlice (clone, changed):<br>'+Object.print(arraySlice)); 
 
Helpers.log2Screen('array didn\'t change, still:<br>'+Object.print(array)); 
 

 

 
function cloneObj(obj) { 
 
    
 
    // clone the whole enchillada, recursive 
 
    function clone(o, curr) { 
 
     for (var l in o){ 
 
      if (!o.hasOwnProperty(l)) { continue; } 
 
      if (o[l] instanceof Object) { 
 
       curr[l] = cloneObj(o[l]); 
 
      } else { 
 
       curr[l] = o[l]; 
 
      } 
 
     } 
 
     return curr; 
 
    } 
 
    
 
    return obj instanceof Array 
 
      ? obj.slice().map(function (v) { return cloneObj(v); }) 
 
      : obj instanceof Date 
 
       ? new Date(obj.getTime()) 
 
       : obj instanceof Object 
 
       ? clone(obj, {}) 
 
       : obj; 
 
}
<script src="https://rawgit.com/KooiInc/Helpers/master/Helpers-min.js"></script>

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