Normalizr转换模式问题

时间:2018-05-25 12:44:40

标签: javascript reactjs redux schema normalizr

我如何转换一些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
  ]
}

我想在data.entities中添加其他架构expensesByTripId,因此结果看起来与此类似:

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
  ]
}

或者以任何其他适合我案例的方式提供PLZ

1 个答案:

答案 0 :(得分:1)

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根据您的要求定制一个