如何在 Typescript 中保持代码 DRY 的同时解析多个 Json 文件?
How to parse multiple Json files while keeping code DRY in Typescript?
我的应用程序正在读取 Typescript 中的多个 Json 文件填充 select 框,但我想避免潮湿(所有内容都写两次)代码并保持干燥(不要重复自己) .我最初对每个 json 文件都有独特的函数,因为它们每个都有不同的值并且需要以不同的方式解析,但我改为制作一个可以从我的主 class 调用的函数读取并解析成数组和 return.
例如,我的国家 Json 看起来像这样:
{
"Countries": {
"country": [
{
"_CountrySEQ": "0",
"_CountryCodeDesc": "UNITED STATES",
"_CountryCode": "USA"
},
{
"_CountrySEQ": "1",
"_CountryCodeDesc": "CANADA",
"_CountryCode": "CAN"
},
, , ,
}
}
我需要将其解析为 key/value 数组,如下所示:
[
{
key:'USA',
value:'UNITED STATES'
},
{
key:'CAN',
value:'CANADA'
}
. . .
]
但我有一个状态json,看起来像这样:
{
"States": {
"state": [
{
"_State": "(cantons) Aargau",
"_CountryCode": "CHE"
},
{
"_State": "Abruzzi",
"_CountryCode": "ITA"
}
. . .
]
}
}
并且需要解析为如下所示:
[
{
key:'CHE',
value:'(cantons) Aargau'
},
{
key:'ITA',
value:'Abruzzi'
}
. . .
]
有没有办法尽可能模块化地做到这一点?像一个单一的功能来处理这个? class 数组或接口是最佳解决方案吗?如果是这样,我该如何正确实施它们?
在你的案例中有两个函数根本不是 DRY。保持简单,如果您还有 2 个 json,请开始考虑其他解决方案。例如
function parseJson1(json) {
return json.Countries.country.map(v => ({key: v._CountryCode, value: v._CountryCodeDesc}));
}
function parseJson2(json) {
return json.States.state.map(v => ({key: v._CountryCode, value: v._State}));
}
每个json一个函数,每个函数只有1行。你为什么要让它变得更复杂?
此函数处理两个数据集。
const parser = (dataset) => {
const [first, second, index1, index2] =
dataset.Countries ?
["Countries", "country", 2, 1] : ["States", "state", 0, 1];
return dataset[first][second].map(item => {
return {
key1: Object.values(item)[index1],
key2: Object.values(item)[index2],
}
});
};
parser(Countries);
parser(States);
我的应用程序正在读取 Typescript 中的多个 Json 文件填充 select 框,但我想避免潮湿(所有内容都写两次)代码并保持干燥(不要重复自己) .我最初对每个 json 文件都有独特的函数,因为它们每个都有不同的值并且需要以不同的方式解析,但我改为制作一个可以从我的主 class 调用的函数读取并解析成数组和 return.
例如,我的国家 Json 看起来像这样:
{
"Countries": {
"country": [
{
"_CountrySEQ": "0",
"_CountryCodeDesc": "UNITED STATES",
"_CountryCode": "USA"
},
{
"_CountrySEQ": "1",
"_CountryCodeDesc": "CANADA",
"_CountryCode": "CAN"
},
, , ,
}
}
我需要将其解析为 key/value 数组,如下所示:
[
{
key:'USA',
value:'UNITED STATES'
},
{
key:'CAN',
value:'CANADA'
}
. . .
]
但我有一个状态json,看起来像这样:
{
"States": {
"state": [
{
"_State": "(cantons) Aargau",
"_CountryCode": "CHE"
},
{
"_State": "Abruzzi",
"_CountryCode": "ITA"
}
. . .
]
}
}
并且需要解析为如下所示:
[
{
key:'CHE',
value:'(cantons) Aargau'
},
{
key:'ITA',
value:'Abruzzi'
}
. . .
]
有没有办法尽可能模块化地做到这一点?像一个单一的功能来处理这个? class 数组或接口是最佳解决方案吗?如果是这样,我该如何正确实施它们?
在你的案例中有两个函数根本不是 DRY。保持简单,如果您还有 2 个 json,请开始考虑其他解决方案。例如
function parseJson1(json) {
return json.Countries.country.map(v => ({key: v._CountryCode, value: v._CountryCodeDesc}));
}
function parseJson2(json) {
return json.States.state.map(v => ({key: v._CountryCode, value: v._State}));
}
每个json一个函数,每个函数只有1行。你为什么要让它变得更复杂?
此函数处理两个数据集。
const parser = (dataset) => {
const [first, second, index1, index2] =
dataset.Countries ?
["Countries", "country", 2, 1] : ["States", "state", 0, 1];
return dataset[first][second].map(item => {
return {
key1: Object.values(item)[index1],
key2: Object.values(item)[index2],
}
});
};
parser(Countries);
parser(States);