【问题标题】:Normalizr convert schema troublesNormalizr 转换模式的麻烦
【发布时间】:2018-11-04 20:59:14
【问题描述】:

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

或者请提供适合我情况的任何其他方式

【问题讨论】:

    标签: javascript reactjs redux schema normalizr


    【解决方案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 根据您的要求定制一个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多