Как сопоставить бэкэнд-сущность с внешним интерфейсом (и наоборот) - PullRequest
0 голосов
/ 29 апреля 2018


Мне нужно сделать сопоставление между 2 объектами JavaScript:

  • Сущность, которая приходит ко мне из бэкэнд-сервиса (backend layer) (* 1)
  • Сущность, которая используется в html-форме (внешний интерфейс)


(* 1) Внутренняя сущность происходит из службы Java REST.

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

Это отображение должно служить в обоих направлениях, то есть:

  • внешний интерфейс -> внутренний интерфейс
  • бэкэнд -> внешний интерфейс

Эта HTML-форма обрабатывает довольно большую сущность со многими полями и разделами (переменными и объектами), поэтому это не тривиальное отображение.

В качестве простого примера:
Предположим, я получаю эту сущность из бэкэнда:

Сущность 1

{
    "a": "aValue",
    "b": "aValue",
    "c": "aValue",
    "d": {
        "da": "aValue",
        "db": "aValue",
        "dc": "aValue",
    }
}


И мне нужно обрести это так

Сущность 2

{
    "x1": {
        "a": "aValue",
        "b": "aValue"
    },
    "x2": {
        "c": "aValue"
    },
    "x3": {
        "da": "aValue",
        "db": "aValue",
        "dc": "aValue"
    }
}

Отображение между этими двумя jsons дается именами свойств. Например: свойство «a» в первом json отображается на «x1.a» во втором json.


Итак, мой вопрос:
Есть ли хорошая практика для достижения этого в javascript?

РЕДАКТИРОВАТЬ:
Чтобы прояснить, что я ищу, мне нужно что-то вроде этого (но приятнее, а не боль в заднице, чтобы поддерживать себя, когда сущности большие):

function mapBackToFront(backendEntity) {
    var myNewFrontEntity = {
            x1: {
                a: backendEntity.a,
                b: backendEntity.b
            },
            x2: {
                c: backendEntity.c
            },
            x3: {
                da: backendEntity.da,
                db: backendEntity.db,
                dc: backendEntity.dc
            }
        }
    };

    return myNewFrontEntity;
}

function mapFrontToBackEntity(frontEntity) {
    var myNewBackEntity = 
    {
        "a": frontEntity.x1.a,
        "b": frontEntity.x1.b,
        "c": frontEntity.x2.c,
        "d": {
            "da": frontEntity.x3.da,
            "db": frontEntity.x3.db,
            "dc": frontEntity.x3.dc,
        }
    };

    return myNewBackEntity
}

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

служба $http предоставляет вам возможность преобразовывать запросы и ответы от сервера, как описано в документах .

Что вам нужно сделать, это переопределить преобразователь по умолчанию с вашей собственной функцией, выполнив:

$http({
  url: '...',
  method: 'GET',
  transformResponse: myCustomTransformer
})

и ваш пользовательский преобразователь должен выглядеть примерно так:

function myCustomTransformer (responseData) {

    var clientObj = {
        // build your client side object based on the response object from the server
    };

    return clientObj;
};

Существует возможность вызывать ваш пользовательский преобразователь после стандартного, добавив ваш преобразователь в массив преобразователей $http.defaults.transformResponse (все объяснено в документации выше)

0 голосов
/ 30 апреля 2018

Итак, кто-то в пути дал мне этот ответ. Сопоставление основано на правилах, где каждое правило объявляет сопоставление между каждым свойством сущностей.
Вот код:

const rules = [
    ["a","x1.a"], 
    ["b","x1.b"],
    ["c","x2.c"],
    ["d.da","x3.da"],
    ["d.db","x3.db"],
    ["d.dc","x3.dc"]
];
function put(entity, s, v) {
    let path = s.split('.');
  let key = path.pop();
  let o = path.reduce( (current, b) => {
    if (!current.hasOwnProperty(b)) {
        current[b] = {};
    }
    return current[b];
  }, entity);
  o[key] = v;
  return entity;
}

function get(entity, s) {
  return s.split('.').reduce( (current, b) => {
    return current[b];
  }, entity);
}

const entity1 = {
    "a": "aValue",
    "b": "aValue",
    "c": "aValue",
    "d": {
        "da": "aValue",
        "db": "aValue",
        "dc": "aValue",
    }
};
const entity2 = {}

Это очень много, что я искал. Я проверил это, и отображение работает в обоих направлениях, от entity1 к entity2 и от entity2 к entity1.

Вот весь код: https://jsfiddle.net/L39wn3ap/1/

0 голосов
/ 29 апреля 2018

Вы можете конвертировать этот json из бэкэнда в бэкэнд .

Вам нужно будет использовать функцию .map () из js, если вы хотите конвертировать в веб-интерфейсе.

И foreach () или для () , если вы хотите конвертировать в бэкэнд.

Пожалуйста, предоставьте скрипку , чтобы я мог помочь вам в этом.

P.S. Какой язык используется в бэкэнде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...