2016-05-06 3 views
4

У меня есть массив следующим образомМассив массив объектов ссылки в Javascript

var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}]; 

Затем я запускаю следующий код и попробуйте groupsOfItems[0].sample[0].a = 10, groupsOfItems[0].sample[0].a, groupsOfItems[1].sample[0].a и groupsOfItems[2].sample[0].a переодеться до 10.

Как сделать Я это предотвращаю?

var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}]; 
 

 

 
    var groupsOfItems = []; 
 

 
    for(let i = 0; i < 10; i++) { 
 
     var item = {}; 
 
     item.sample = _.clone(sample); 
 
     groupsOfItems.push(item); 
 
    } 
 

 

 

 
    groupsOfItems[0].sample[0].a = 10 
 
    
 
    console.log(groupsOfItems[0].sample[0].a,groupsOfItems[1].sample[0].a,groupsOfItems[2].sample[0].a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

+1

Я создал для вас фрагмент. Пожалуйста, сделайте это в будущем. Сохраняет много времени при тестировании вашего кода. – mplungjan

+0

Будьте осторожны с клонированием объектов, используя библиотеки (или просто вообще). Если вы вызываете метод на клонированном объекте, метод все равно будет ссылаться на исходный объект и будет изменять исходный объект, а не клонированный объект. –

ответ

6

Вам необходимо клонировать объект до assiging его Referece свойству массива

Заменить

item.sample = sample; 

с

item.sample = JSON.parse(JSON.stringify(sample)); 

Обратите внимание, что этот метод клонирования будет менее эффективным, если объект-образец будет расти. Попробуйте другие методы, показанные here.

+0

Я попытался с _.clone. Не помогло –

+0

@JaseemAbbas пробовал метод, которым я поделился – gurvinder372

+1

@JaseemAbbas '_.clone()' является * мелкой копией *. метод JSON делает * глубокий клон *. –

0

Я хотел бы избежать клонирования объекта в целом. Объекты клонирования имеют тенденцию заканчиваться болью дальше по дорожке. Вот как я добился подобного в прошлом без клонирования.

var sample = [{ a: 1, b: 1, c: 1}, { a: 1, b: 1, c: 1}, { a: 1, b: 1, c: 1}]; 
var groupsOfItems = []; 

var Item = function(a, b, c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

for (let i = 0; i < 10; i++) { 
    var item = {}; 
    item.sample = _.map(sample, function(item) { 
    return new Item(item.a, item.b, item.c) 
    }); 
    groupsOfItems.push(item); 
} 

groupsOfItems[0].sample[0].a = 10 

console.log(groupsOfItems[0].sample[0].a, groupsOfItems[1].sample[0].a, groupsOfItems[2].sample[0].a); 
//10 1 1 

Таким образом, вы назначаете им весь контейнер для своих модификаций, и проблема с клонированием уходит.

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