如何在 Typescript 中保持代码 DRY 的同时解析多个 Json 文件?
Posted
技术标签:
【中文标题】如何在 Typescript 中保持代码 DRY 的同时解析多个 Json 文件?【英文标题】:How to parse multiple Json files while keeping code DRY in Typescript? 【发布时间】:2020-08-21 23:30:18 【问题描述】:我的应用程序在 Typescript 中读取多个 Json 文件填充选择框,但我想避免潮湿(将所有内容写两次)代码并保持干燥(不要重复自己)。我最初对每个 json 文件都有唯一的函数,因为它们每个都有不同的值并且需要以不同的方式解析,但我改为创建一个可以从我的主类调用的函数,该函数将读取并解析为数组和返回。
例如,我的国家 Json 如下所示:
"Countries":
"country": [
"_CountrySEQ": "0",
"_CountryCodeDesc": "UNITED STATES",
"_CountryCode": "USA"
,
"_CountrySEQ": "1",
"_CountryCodeDesc": "CANADA",
"_CountryCode": "CAN"
,
, , ,
我需要将其解析为键/值数组,如下所示:
[
key:'USA',
value:'UNITED STATES'
,
key:'CAN',
value:'CANADA'
. . .
]
但我有一个如下所示的 statesjson:
"States":
"state": [
"_State": "(cantons) Aargau",
"_CountryCode": "CHE"
,
"_State": "Abruzzi",
"_CountryCode": "ITA"
. . .
]
并且需要解析出来看起来像这样:
[
key:'CHE',
value:'(cantons) Aargau'
,
key:'ITA',
value:'Abruzzi'
. . .
]
有没有办法尽可能做到模块化?像一个函数来处理这个?类或接口数组是最佳解决方案吗?如果是这样,我该如何正确实施它们?
【问题讨论】:
您是否正在寻找一个函数来处理这两种 Json 类型? @CiBoz 是的。我会把它放在我的问题中 【参考方案1】:在您的情况下拥有两个功能根本不是 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行。为什么要让它变得更复杂?
【讨论】:
有什么建议吗? 在你的阶段,我会为每个json文件保留一个解析函数。【参考方案2】:这个函数处理两个数据集。
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);
【讨论】:
谢谢!这是一个巨大的帮助!我有 7 个 json 文件需要使用它,所以我要做的就是把它放在一个类中,每当我调用它时,我都会传入唯一标识符(你有"Countries", "country", etc
)。这样,它将只是一个执行读取和解析的函数,我所要做的就是告诉它文件在哪里并给它ID。再次,非常感谢!
我很高兴找到解决方案。如果您打算传递不同类型的数据集,我认为您可以改进我创建 first, last, index1, index2
的部分。我相信你可以减少函数的参数数量。好吧……祝你好运!以上是关于如何在 Typescript 中保持代码 DRY 的同时解析多个 Json 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Facebook React 的 JSX 拥有条件元素并保持 DRY?
保持我的代码DRY为`$ onInit`和`$ onChanges`方法