打字稿使用接口创建JSON对象

时间:2019-07-18 01:52:22

标签: json typescript

我需要在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

1 个答案:

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

然后一切都会按预期进行。