如何在 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?

如何使用 Django 模型字段定义保持 DRY

保持我的代码DRY为`$ onInit`和`$ onChanges`方法

TypeScript数组到字符串文字类型

在 React Native 中使用 TextInput 等组件在样式方面保持 DRY 的最佳实践?

MVC 验证 - 使用服务层保持 DRY - 最佳实践是啥?