Нормализр конвертирует схемы хлопот - PullRequest
0 голосов
/ 25 мая 2018

Как я могу преобразовать некоторый массив json

[
   {
      "travelExpenseId":11,
      "tripId":2,
      "paymentPurpose":"some payment purpose 2",
      "receiptNumber":"EF12312_2",
      "receiptDate":"2018-09-30T00:00:00",
      "receiptPrice":107000.0,
      "receiptCurrency":"руб."
   },
   {
      "travelExpenseId":10,
      "tripId":2,
      "paymentPurpose":"some payment purpose 1",
      "receiptNumber":"EF12312_1",
      "receiptDate":"2018-09-30T00:00:00",
      "receiptPrice":107000.0,
      "receiptCurrency":"руб."
   }
]

во что-то подходящее, чтобы быстро получить расходы по travelExpenseId и получить расходы по tripId.

Теперь я использую что-то вроде этого:

export const expenseSchema = new schema.Entity('expenses', {}, { idAttribute: 'travelExpenseId' });
export const expensesListSchema = [expenseSchema];

и получим результат:

data: {
  entities: {
    expenses: {
      '10': {
        travelExpenseId: 10,
        tripId: 2,
        paymentPurpose: 'some payment purpose 1',
        receiptNumber: 'EF12312_1',
        receiptDate: '2018-09-30T00:00:00',
        receiptPrice: 107000,
        receiptCurrency: 'руб.'
      },
      '11': {
        travelExpenseId: 11,
        tripId: 2,
        paymentPurpose: 'some payment purpose 2',
        receiptNumber: 'EF12312_2',
        receiptDate: '2018-09-30T00:00:00',
        receiptPrice: 107000,
        receiptCurrency: 'руб.'
      }
    }
  },
  result: [
    11,
    10
  ]
}

Я хочу добавить дополнительную схему expensesByTripId в data.entities, поэтому результат должен выглядеть примерно так:

data: {
  entities: {
    expensesByTripId: {
       '2': [10, 11],
    },
    expenses: {
      '10': {
        travelExpenseId: 10,
        tripId: 2,
        paymentPurpose: 'some payment purpose 1',
        receiptNumber: 'EF12312_1',
        receiptDate: '2018-09-30T00:00:00',
        receiptPrice: 107000,
        receiptCurrency: 'руб.'
      },
      '11': {
        travelExpenseId: 11,
        tripId: 2,
        paymentPurpose: 'some payment purpose 2',
        receiptNumber: 'EF12312_2',
        receiptDate: '2018-09-30T00:00:00',
        receiptPrice: 107000,
        receiptCurrency: 'руб.'
      }
    }
  },
  result: [
    11,
    10
  ]
}

Или предоставьте мне, пожалуйста, любой другой способ, который подходит для моего случая

1 Ответ

0 голосов
/ 25 мая 2018

let data = {
      entities: {
        expenses: {
          '10': {
            travelExpenseId: 10,
            tripId: 2,
            paymentPurpose: 'some payment purpose 1',
            receiptNumber: 'EF12312_1',
            receiptDate: '2018-09-30T00:00:00',
            receiptPrice: 107000,
            receiptCurrency: 'руб.'
          },
          '11': {
            travelExpenseId: 11,
            tripId: 2,
            paymentPurpose: 'some payment purpose 2',
            receiptNumber: 'EF12312_2',
            receiptDate: '2018-09-30T00:00:00',
            receiptPrice: 107000,
            receiptCurrency: 'руб.'
          }
        }
      },
      result: [
        11,
        10
      ]
    }

    let object = {};

    Object.values(data.entities.expenses).forEach(expenses => {
      
      let result = object[expenses.tripId] || [];
      object[expenses.tripId] = [...result, expenses.travelExpenseId];
    });

		data.entities["expensesByTripId"] = object;
    console.log(data);
    

Я не уверен, как работает Normalizr, но я использую VanillaJS, чтобы изготовить его по вашему требованию

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