使用从 JSON 数组转换的对象填充 typescript/react 中的数组
filling an array in typescript/react with objects converted from JSON array
我有一个 JSON-文件,其中包含大约 700 行的设备和一些关于它们的信息(即序列号、macadress、端口...)。
在另一个文件中,我创建了一个对象,如
type jsonObj = {
serialNumber: string;
macAdress: string;
port: string;
}
现在我想用这个 jsonDevice 对象循环填充 table,但不知何故我无法让它工作。
我的代码是这样的:
const ObjectTable: FC = () => {
const entities: jsonObj[] = [
{
serNom: jsonDevices[0].serNom, //jsonDevices is my json file
macAdr: jsonDevices[0].macAdr,
tunPort: jsonDevices[0].tunPort
},
];
FC 是从 React 导入的,上面的代码可以正常工作。我收到一个 table-输出,其中包含此行的数据(例如 jsonDevices[0].serNom 正确地给我 123456789)但现在我想自动填充整个 list/array来自 json 台设备的剩余行。在 Java 中,我会用这样的循环来解决它:
for (int i = 0, i<jsonObj.length, i++){
ObjectTable.add(jsonObj[i].serNom);
ObjectTable.add(jsonObj[i].macAdr);
ObjectTable.add(jsonObj[i].tunPort);
}
请帮助我。这个问题让我很头疼。
注意:您的代码将无法编译,因为您已将 jsonObj
类型声明为具有以下形状:
type jsonObj = {
serialNumber: string;
macAdress: string;
port: string;
}
但是您正在尝试创建使用不同键名的 jsonObj
个对象的数组:
{
serNom: jsonDevices[0].serNom, //jsonDevices is my json file
macAdr: jsonDevices[0].macAdr,
tunPort: jsonDevices[0].tunPort
}
除此之外,您的问题的解决方案比看起来简单得多:Array.prototype.map
:
const entities: jsonObj[] = jsonDevices.map((device) => {
return {
serialNumber: device.serNom,
macAddress: device.macAdr,
port: device.tunPort,
};
});
另一个注意事项:这些缩写的变量名很难阅读。我建议选择一个约定并坚持下去。如果您的 JSON 文件遵循 jsonObj
的命名约定,那么您甚至不需要将 JSON 映射到不同的形状——您只需这样做:
const entities = jsonDevices as jsonObj[];
(这被称为 type assertion——使用 as
关键字后跟一个类型来确保 TypeScript 编译器 left-hand 值是指定的类型。)
假设您有这样的数据:
[
{ id: 1, name: "test-1" },
{ id: 2, name: "test-random" },
{ id: 3, desc: "444" }
]
并且你有这个数据的一些结构,创建一个 interface
interface SomeInterface {
id: number;
name?: string;
desc?: string;
}
现在很简单,如果 JSON 输入数据被称为 someData
并且结果数据被称为 hmm
,你可以像这样:
const hmm: SomeInterface[] = [];
someData.map((data) => {
hmm.push(data as SomeInterface);
});
您还可以通过以下方式简化:
hmm: SomeInterface[] = someData as SomeInterface[];
这是一个codesandbox,可以随意使用它:https://codesandbox.io/s/dreamy-chatelet-hr5ub6?file=/src/App.tsx:343-456
这里有两个关于同一个问题的 sof 线程,讨论为什么 interface over types:
我有一个 JSON-文件,其中包含大约 700 行的设备和一些关于它们的信息(即序列号、macadress、端口...)。
在另一个文件中,我创建了一个对象,如
type jsonObj = {
serialNumber: string;
macAdress: string;
port: string;
}
现在我想用这个 jsonDevice 对象循环填充 table,但不知何故我无法让它工作。
我的代码是这样的:
const ObjectTable: FC = () => {
const entities: jsonObj[] = [
{
serNom: jsonDevices[0].serNom, //jsonDevices is my json file
macAdr: jsonDevices[0].macAdr,
tunPort: jsonDevices[0].tunPort
},
];
FC 是从 React 导入的,上面的代码可以正常工作。我收到一个 table-输出,其中包含此行的数据(例如 jsonDevices[0].serNom 正确地给我 123456789)但现在我想自动填充整个 list/array来自 json 台设备的剩余行。在 Java 中,我会用这样的循环来解决它:
for (int i = 0, i<jsonObj.length, i++){
ObjectTable.add(jsonObj[i].serNom);
ObjectTable.add(jsonObj[i].macAdr);
ObjectTable.add(jsonObj[i].tunPort);
}
请帮助我。这个问题让我很头疼。
注意:您的代码将无法编译,因为您已将 jsonObj
类型声明为具有以下形状:
type jsonObj = {
serialNumber: string;
macAdress: string;
port: string;
}
但是您正在尝试创建使用不同键名的 jsonObj
个对象的数组:
{
serNom: jsonDevices[0].serNom, //jsonDevices is my json file
macAdr: jsonDevices[0].macAdr,
tunPort: jsonDevices[0].tunPort
}
除此之外,您的问题的解决方案比看起来简单得多:Array.prototype.map
:
const entities: jsonObj[] = jsonDevices.map((device) => {
return {
serialNumber: device.serNom,
macAddress: device.macAdr,
port: device.tunPort,
};
});
另一个注意事项:这些缩写的变量名很难阅读。我建议选择一个约定并坚持下去。如果您的 JSON 文件遵循 jsonObj
的命名约定,那么您甚至不需要将 JSON 映射到不同的形状——您只需这样做:
const entities = jsonDevices as jsonObj[];
(这被称为 type assertion——使用 as
关键字后跟一个类型来确保 TypeScript 编译器 left-hand 值是指定的类型。)
假设您有这样的数据:
[
{ id: 1, name: "test-1" },
{ id: 2, name: "test-random" },
{ id: 3, desc: "444" }
]
并且你有这个数据的一些结构,创建一个 interface
interface SomeInterface {
id: number;
name?: string;
desc?: string;
}
现在很简单,如果 JSON 输入数据被称为 someData
并且结果数据被称为 hmm
,你可以像这样:
const hmm: SomeInterface[] = [];
someData.map((data) => {
hmm.push(data as SomeInterface);
});
您还可以通过以下方式简化:
hmm: SomeInterface[] = someData as SomeInterface[];
这是一个codesandbox,可以随意使用它:https://codesandbox.io/s/dreamy-chatelet-hr5ub6?file=/src/App.tsx:343-456
这里有两个关于同一个问题的 sof 线程,讨论为什么 interface over types: