Как анализировать несколько файлов Json, сохраняя код DRY в Typescript? - PullRequest
1 голос
/ 06 мая 2020

Мое приложение читает несколько файлов Json в Typescript, заполняет поля выбора, но я хочу избежать мокрого (напишите все дважды) кода и сохранить вещи dry (не повторяйтесь). Изначально у меня были уникальные функции для каждого файла json, поскольку каждый из них имеет разные значения и должен анализироваться по-разному, но вместо этого я создал одну функцию, которая может быть вызвана из моего основного класса, который будет выполнять чтение и синтаксический анализ в array и return.

Например, мои страны 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'
    }
    . . .
]

Но у меня есть состояния json, которые выглядят так:

    {
      "States": {
        "state": [
          {
            "_State": "(cantons) Aargau",
            "_CountryCode": "CHE"
          },
          {
            "_State": "Abruzzi",
            "_CountryCode": "ITA"
          }
          . . .
       ]
     }
   }

И их нужно проанализировать, чтобы они выглядели так:

[
    {
        key:'CHE',
        value:'(cantons) Aargau'
    },
    {
        key:'ITA',
        value:'Abruzzi'
    }
    . . .
]

Есть ли способ сделать это максимально модульным? Хотите, чтобы с этим справилась одна функция? Массивы классов или интерфейсов - лучшее решение? И если да, то как мне их правильно реализовать?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Эта функция обрабатывает оба набора данных.


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);

0 голосов
/ 06 мая 2020

Наличие двух функций в вашем случае - это вовсе не 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 строку. Зачем вам пытаться усложнять его?

...