Как мне получить такой результат?

{"obj1": {
    "title": "title",
    "data": [1,2,3]
},
"obj2": {
    "title": "title",
    "data": [4,5,6]
},
"obj3": {
    "title": "title",
    "data": [7,8,9]
}}
    var obj = {title:'title'}
    var newobj = {};

    newobj.obj1 = obj;
    newobj.obj2 = obj;
    newobj.obj3 = obj;

    newobj.obj1.data = [];
    newobj.obj1.data = [1,2,3];

    newobj.obj2.data = [];
    newobj.obj2.data = [4,5,6];

    newobj.obj3.data = [];
    newobj.obj3.data = [7,8,9];

    console.log(JSON.stringify(newobj))
0
mxh861001 25 Авг 2017 в 07:14

5 ответов

Лучший ответ

Вы присваиваете obj свойствам newObj. Это не будет назначать новый объект этим свойствам, что в основном означает, что они просто ссылаются на obj. И когда на него просто ссылаются, всякий раз, когда вы вносите изменения в эту ссылку, все остальные места, на которые она ссылается, меняются.

Что вам нужно сделать, это сделать копию obj, а затем назначить ее для newObj сторонников. ... синтаксис в { {X3}} создает новый объект со свойствами obj.

var obj = {title:'title'}
var newobj = {};

newobj.obj1 = { ...obj };
newobj.obj2 = { ...obj };
newobj.obj3 = { ...obj };

newobj.obj1.data = [1,2,3];
newobj.obj2.data = [4,5,6];
newobj.obj3.data = [7,8,9];

console.log(JSON.stringify(newobj));
0
dork 25 Авг 2017 в 04:31

В вашем примере строки 8, 11 и 14 можно просто удалить.

Кроме того, объекты в JavaScript являются ссылками на местоположение в памяти. Итак, когда вы делаете:

newobj.obj1 = obj;
newobj.obj2 = obj;
newobj.obj3 = obj;

Вы говорите, что newobj.obj1, newobj.obj2, newobj.obj3 указывают на одно и то же место в памяти. То есть, если вы измените obj1, вы также измените obj2 и obj3. Вы должны убедиться, что они являются уникальными объектами, такими как это:

var newobj = {};

newobj.obj1 = {title:'title'};
newobj.obj2 = {title:'title'};
newobj.obj3 = {title:'title'};

newobj.obj1.data = [1,2,3];

newobj.obj2.data = [4,5,6];

newobj.obj3.data = [7,8,9];

console.log(JSON.stringify(newobj))

Это не единственный способ сделать их уникальными, но суть в том, что им нужно иметь свое местоположение в памяти.

0
Joseph Ditton 25 Авг 2017 в 04:26

В Js вы можете напрямую создать объект, используя буквенную нотацию объекта, и его прелесть в том, что он позволяет вам также определять свойства.

Просто используйте

Var obj = {obj1: {"title": "title", "data": [1,2,3]}, obj2: {"title": "title", "data": [4,5,6] }, obj3: {"title": "title", "data": [7,8,9]}}

1
rootkill 25 Авг 2017 в 04:26

Я считаю, что ваша проблема в том, что вы устанавливаете newobj.obj1, obj2 и obj3 all = obj. Это делается по ссылке, поэтому, когда вы обновляете данные каждого из obj1, 2, 3, вы фактически обновляете ссылку на obj и обновляете их все.

0
andrewf 25 Авг 2017 в 04:26

Вы можете сделать это просто с помощью функции конструктора

function DataObj(title, data) {
    this.title = title;
    this.data = data;
}

var newObj = {
    obj1: new DataObj('title', [1,2,3]),
    obj2: new DataObj('title', [4,5,6]),
    obj3: new DataObj('title', [7,8,9])
}

console.log(newObj);
-1
Arun Redhu 25 Авг 2017 в 04:32