javascript - Normalizr 转换模式的麻烦

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

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

最佳答案

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

关于javascript - Normalizr 转换模式的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529558/

相关文章:

javascript - 更改状态而不覆盖 react 中的其他值

javascript - 如果我在 'perPage = 20' 地址中有 'url' (获取 20)并且有 1000 个元素,如何检查数组长度?

reactjs - 使用 enzyme 测试 React 门户

javascript - React redux reducer 没有改变

reactjs - 使用react-router-dom,如何从React组件外部访问浏览器History对象?

javascript - Mongoose 错误填充虚拟

javascript - 我可以定义哪些字符允许 'break' 一个字吗?

reactjs - 在 Redux Observable 获取史诗中将超时运算符放在哪里

javascript - 如何为每个输入标签使用相同的代码?

javascript - 使用 JavaScript 链接两个自动更新(根据另一个中的输入)数字输入字段