我需要在JSON字段中构建一个自定义JSON对象以存储在PostgreSQL中,并且我使用typescript来做到这一点。
在我的测试案例中,我有以下代码:
interface Product {
id: number,
quantity: number,
}
let prod: Product = {} as any;
interface Products extends Array<Product>{}
let productItems : Products = [];
let productItems2 : Products = [];
let obj = {};
let container = [];
prod.id = 1;
prod.quantity = 10;
console.log("prod1: ", prod);
productItems.push(prod);
prod.id = 2;
prod.quantity = 100;
console.log("prod2: ", prod);
productItems.push(prod);
prod.id =3;
prod.quantity = 34;
console.log("prod3: ", prod);
productItems.push(prod);
obj = { "products1" : productItems}
container.push(obj);
prod.id = 10;
prod.quantity = 10;
console.log("prod2.1: ", prod);
productItems2.push(prod);
prod.id = 20;
prod.quantity = 100;
productItems2.push(prod);
console.log("prod2.2: ", prod);
prod.id =30;
prod.quantity = 34;
console.log("prod2.3: ", prod);
productItems2.push(prod);
obj = { "products2" : productItems2}
container.push(obj);
obj = { "products1" : productItems, "products2": productItems2}
console.log(JSON.stringify(obj));
出于某种原因,当在控制台中显示var productItems 的内容时,始终显示最后一个项目 prod.id = 30和prod.quantity = 34 。
该数组未存储每个新产品的数据,但是在控制台中,我可以看到每个新产品的正确值。
我需要获得的对象等于 obj ,其正确值如下:
{
"products1": [{
"id": 1,
"quantity": 10
}, {
"id": 2,
"quantity": 100
}, {
"id": 3,
"quantity": 34
}],
"products2": [{
"id": 10,
"quantity": 10
}, {
"id": 20,
"quantity": 100
}, {
"id": 30,
"quantity": 34
}]
}
如果我打印var 容器,则将JSON对象显示在[]数组中。
我做错了什么?
我在这里玩我的代码 https://stackblitz.com/edit/typescript-3nfapq?file=index.ts
答案 0 :(得分:1)
问题是您要重复更改同一对象,而不是为要添加到数组中的每个项目创建一个新对象。
问题集中在变量和值之间。要了解我的意思,让我们遍历代码的一部分。我们从
开始let prod = {};
声明变量prod
并在某个内存位置(例如位置1)为其分配初始为空的对象的值。
然后我们点击:
prod.id = 1;
prod.quantity = 10;
这将修改对象prod
所引用的对象-位置1的对象-使其现在具有id 1和数量10。下一行,
productItems.push(prod);
将位置1的对象推到productItems
上。到目前为止,上帝。但是接下来,我们有:
prod.id = 2;
prod.quantity = 100;
productItems.push(prod);
这再次将位置1的对象更改为id
2和quantity
100,然后再次将该对象推到productItems
上。因此,此时,位置1处的对象是{id: 2, quantity: 100}
,而productItems
包含对其的两个引用。
要解决此问题,您需要避免重复使用同一对象。如果需要,您仍然可以使用相同的变量 prod
,但是每次插入新的 object 时,都需要使用它来引用不同的 object 数组。例如,如果您写了:
let prod = {} as any;
prod.id = 1;
prod.quantity = 10;
console.log("prod1: ", prod);
productItems.push(prod);
prod = {} as any;
prod.id = 2;
prod.quantity = 100;
console.log("prod2: ", prod);
productItems.push(prod);
prod = {} as any;
prod.id =3;
prod.quantity = 34;
console.log("prod3: ", prod);
productItems.push(prod);
然后一切都会按预期进行。