LINUX.ORG.RU

Помогите пожалуйста разобраться с JavaScript

 


0

1

Возникла проблема в понимании. Создал масив с обьектами, но при замене значения одного из масива- меняется весь.

var doska=[]; var e={id:1, color:1, position:1}; var bukva =[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’]; var x = 0; var doska = new Array(); while (x<8){ for (var i = 0; i < 8; i++){ doska.push(new Object(e)); doska[doska.length-1].id=bukva[x]+i; } x++; } Что я сделал не так?



Последнее исправление: alexprov (всего исправлений: 1)
var doska = [];
var e = { id: 1, color: 1, position: 1 }; 
var bukva = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; 
var x = 0; 
var doska = new Array(); 
while (x < 8) { 
    for (var i = 0; i < 8; i++) { 
        doska.push(new Object(e)); 
        doska[doska.length - 1].id = bukva[x] + i; 
    } 
    x++; 
}

Используй разметку кода.

при замене значения одного из масива- меняется весь.

Как именно ты меняешь это значение?

EXL ★★★★★
()
Ответ на: комментарий от alexprov
var x = 0; 
var bukva = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; 
var doska = new Array(); 
while (x < 8) { 
    for (var i = 0; i < 8; i++) { 
        doska.push({ id: bukva[x]+i, color: 1, position: 1 });
    } 
    x++; 
}

Так попробуй.

EXL ★★★★★
()
doska.push(new Object(e)); 

Это что за такое? Должно быть Object.assign({}, e), потому как копируются только примитивы, а объекты передают ссылку. Ты кладёшь во все элементы массива ссылку на один и тот же объект, поэтому изменения доступны из всех элементов.

InterVi ★★★★★
()
Ответ на: комментарий от trashymichael

В c++ как бы также будет, ибо тут, грубо говоря, массив - это вектор указателей на структуру.

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

vector<str*> vec;
str e;
vec.pushBack(&e);
vec.pushBack(&e);
str *b = vec.back();
++b->id;

// Будет 1 везде
anonymous
()
Ответ на: комментарий от EXL

оно для прототипирования функций, а assign просто копирует свойства через геттеры и сеттеры

let t = {'a': 1, 'b': 2}
undefined
Object.assign({}, t)
{a: 1, b: 2}
Object.create(t)
{}
InterVi ★★★★★
()
Ответ на: комментарий от trashymichael

ты все делаешь правильно, ошибка тут в самом js

Если в жабке засунуть _один_ объект в массив получится тоже самое, но виноват жс. Дебилы.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

То есть если в e будет какой-то массивный и сложный объект, ТС снова получит похожих проблем при Object.assign({}, t)?

EXL ★★★★★
()
Ответ на: комментарий от EXL

Конечно. Его надо рекурсивно обходить, учитывая возможность наличия циклических ссылок. Где-то это по-другому работает?

crutch_master ★★★★★
()
Ответ на: комментарий от EXL

снова получит похожих проблем

Нельзя назвать это проблемой, это ожидаемое поведение всё таки.

ddidwyll ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.