Сопоставление объекта сервера с другим объектом - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть ответ сервера в этом формате:

"BudgetDays": [
        {
            "Id": 1,
            "Date": "2019-01-08T00:00:00",
            "Earned": 10,
            "Spent": 8,
            "Logged": false,
            "LoggedTime": "2019-02-10T12:36:09.377"
        },
        {
            "Id": 2,
            "Date": "2019-01-09T00:00:00",
            "Earned": 23,
            "Spent": 30,
            "Logged": false,
            "LoggedTime": "2019-02-10T12:36:09.38"
        }, ...

Класс Typescript строчный / camelcase, как я могу сопоставить json с camelcase?

Функция возвращает BudgetDate[] так что мне нужно как-то сопоставить его с этим:

return this.http.get<Budget>(this.apiRoot + '/api/budgetdays', { params: params })
  .pipe(
    map(budgetDatesList.BudgetDates => sameObjectWithCamelCase),
    catchError((error: any) => Observable.throw(error))
  );

Как мне сопоставить объект со свойствами нижнего регистра.

1 Ответ

0 голосов
/ 11 февраля 2019

Сторона решения RxJS проста - просто используйте оператор map, как вы уже определили.

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

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

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

const { of } = rxjs;
const { map } = rxjs.operators;

const data = {
  "BudgetDays": [
    {
      "Id": 1,
      "Date": "2019-01-08T00:00:00",
      "Earned": 10,
      "Spent": 8,
      "Logged": false,
      "LoggedTime": "2019-02-10T12:36:09.377"
    },
    {
      "Id": 2,
      "Date": "2019-01-09T00:00:00",
      "Earned": 23,
      "Spent": 30,
      "Logged": false,
      "LoggedTime": "2019-02-10T12:36:09.38"
    },
 ],
};

function mapPropNames(o) {
  if (typeof o !== 'object' || o === null) {
    return o;
  }
  return Object.keys(o).reduce((a, key) => {
    // Customise the transformation of each property key if necessary
    const mappedKey = `${key[0].toLowerCase()}${key.slice(1)}`;
    a[mappedKey] = mapPropNames(o[key]);
    return a;
  }, o instanceof Array ? [] : {});
}

const request = of(data).pipe(
  map(mapPropNames),
);

request.subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...