JavaScript 对象赋值



如何得到这个结果?

{"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))

在 Js 中,您可以使用对象文字表示法直接创建一个对象,它的美妙之处在于它也允许您定义属性。

只需使用

var obj = { obj1:{ "标题": "标题", "数据": [1,2,3] }, 对象2: { "标题": "标题", "数据": [4,5,6] }, obj3: { "标题": "标题", "数据": [7,8,9] }}

您正在将obj分配给newObj的属性。这不会为这些属性分配一个新对象,这基本上意味着它们只是引用obj。当它只是被引用时,每当您对该引用进行更改时,引用它的所有其他地方都会更改。

你需要做的是制作一份obj的副本,然后将其分配给newObj的财产。{}中的...语法创建一个具有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));

我相信,你的问题是你正在设置 newobj.obj1、obj2 和 obj3 all = obj。这是通过引用完成的,因此当您更新 obj1、2、3 中每个的数据时,您实际上是在更新对 obj 的引用,从而更新它们。

在您的示例中,可以删除第 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))

这不是使它们独一无二的唯一方法,但关键是它们需要在内存中拥有自己的位置。

你可以简单地使用构造函数

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);

最新更新