Описывая преобразование между двумя наборами данных ... мета-преобразование? - PullRequest
2 голосов
/ 21 мая 2019

Я пытаюсь исследовать различные подходы к идее, которую я имею в голове, и я не совсем уверен, как искать то, что я пытаюсь сделать.

У меня есть серияфункции.Все они преобразуют один и тот же формат JSON (схему) (с разными данными).В разные объекты (разные схемы).

Например, у меня может быть JSON как ...

{
  heading: "Fogmeister",
  type: "person",
  body_text: "iOS developer",
  sections: [
    {
      heading: 'Describing a transform between two sets of data... a "meta-transform"?',
      type: "post",
      body_text: "I'm trying to investigate..."
    },
    {
      // other post
    }
  ]
}

И я бы хотел преобразовать его в пользовательский объект, такой как ...

{
  name: "Fogmeister",
  profile: "iOS developer",
  posts: [
    { title: 'Describing a transform between two sets of data... a "meta-transform"?' },
    { title: 'Other title' }
  ]
}

Но у меня может быть какой-то другой JSON, например ...

{
  heading: 'Describing a transform between two sets of data... a "meta-transform"?',
  type: "post",
  body_text: "I'm trying to investigate...",
  sections: [
    {
      heading: null,
      type: "answer",
      body_text: "What you're looking for is..."
    },
    {
      // other answer
    }
  ]
}

И я бы хотел преобразовать его в объект post, например ...

{
  title: 'Describing a transform between two sets of data... a "meta-transform"?',
  body: "I'm trying to investigate...",
  answers: [
    { body_text: "What you're looking for is..." },
    { body_text: 'Other answer' }
  ]
}

Надеюсь, из этого небольшого примера вы можете видеть, что входная схема та же, но выходная схема может сильно отличаться.

В настоящее время у меня есть разные функции для сопоставления каждого другого типа.Но я пытаюсь понять, смогу ли я придумать способ, которым я могу describe отобразить между входом и выходом, а затем поместить это в объект (или что-то еще).

Таким образом, я могуесть единственная функция, которая использует этот Mapping объект для преобразования данных.

Но ... я не знаю, имеет ли это имя уже имя.Это что-то вроде meta-transform, так как я хочу иметь возможность описывать преобразование, а не выполнять преобразование самостоятельно.

Могу ли я найти в Google что-нибудь, что даст больше информации об этом виде программирования?

Я не ищу код, который сделает это.Больше всего материала, который я могу прочитать по теме, чтобы я мог сделать это сам.

Спасибо

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Звучит так, как будто вы описываете преобразователь схемы, который читает схему и строит из нее абстрактное синтаксическое дерево. Затем вы можете прочитать это дерево, чтобы создать новую схему по своему вкусу, позволяющую описывать различные формы из одного и того же AST.

В этом репо мастерски объясняется, как создать компилятор с помощью JavaScript. со схемой (поскольку это JSON) это будет намного проще, поскольку все, что вам нужно сделать, это проанализировать JSON и выполнить итерации объектов, а не читать каждый символ в файле.

https://github.com/jamiebuilds/the-super-tiny-compiler

Помните, что целью является создание чего-то, что может генерировать чистый независимый AST, который может потреблять что-то еще. Удачи ?

0 голосов
/ 21 мая 2019

Более практичный подход с использованием объекта для шаблона и функции для получения сопоставленных свойств.

function convert(pattern, object) {
    return Object.assign({}, ...Object
        .entries(object)
        .map(([k, v]) => k in pattern
            ? typeof pattern[k] === 'object'
                ? { [pattern[k].name]: pattern[k].fn(v) }
                : { [pattern[k]]: v }
            : {}
        )
    );
}

var pattern1 = {
        heading: 'name',
        body_text: 'profile',
        sections: { name: 'posts', fn: array => array.map(o => convert({ heading: 'title' }, o)) }
    },
    input1 = { heading: "Fogmeister", type: "person", body_text: "iOS developer", sections: [{ heading: 'Describing a transform between two sets of data... a "meta-transform"?', type: "post", body_text: "I'm trying to investigate..." }, {}] };

console.log(convert(pattern1, input1));
.as-console-wrapper { max-height: 100% !important; top: 0; }
...