我有一个JSON文件,其中包含700行设备和一些有关它们的信息(例如序列号、macadress、端口.)。
在另一个文件中,我创建了一个对象,如
type jsonObj = {
serialNumber: string;
macAdress: string;
port: string;
}
现在,我想在循环中用这个jsonDevice对象填充一个表,但不知怎么的,我无法让它工作。
我的代码是这样的:
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中的一个导入,上面的代码正在工作。我收到了带有这一行数据的表输出(例如,jsonDevices.serNom给了我正确的123456789),但是现在我想用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);
}
请帮帮我。这件事让我头疼。
发布于 2022-02-20 13:39:49
注意:您的代码将不会编译,因为您已经声明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[];
(这称为类型断言-using,as
关键字后面跟着一个类型,以确保TypeScript编译器左边的值是指定的类型。)
发布于 2022-02-20 13:48:05
让我们假设您有一些这样的数据:
[
{ 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[];
这里有一个代码框,请随意使用它:https://codesandbox.io/s/dreamy-chatelet-hr5ub6?file=/src/App.tsx:343-456
下面是两个线程,它们都在同一个问题上,讨论了为什么接口多于类型
https://stackoverflow.com/questions/71194901
复制相似问题