【问题标题】:Angular how to map key and valueAngular如何映射键和值
【发布时间】:2021-01-24 02:36:15
【问题描述】:

所以我正在尝试映射和对象。它有一个键,而那个键有一个值。 我从服务器获得了整个收据,这是付款部分(这是我收到的响应的预览):

paragonSequenceNumber: null
payments: {CARD: 4, CASH: 8}
pkp: "BBBBBBBBBBBBBBBBBBBBB"

所以我正在映射它,然后在带有 *ngFor 的 html 中使用它,然后写出键的值。 这是我的 ReceiptDTO:

export interface ReceiptDTO {
        payments: {[key: string]: number }; // key: ReceiptPaymentType (enums)
}

这是我的 ReceiptViewModel

interface ReceiptViewModel {
  payments: {[key: string]: number }[]; // I'm not actually sure what to put here
}

这是 PaymentViewModel

interface PaymentViewModel {
  CASH: number;
  CARD: number;
  VOUCHER: number;
}

这就是我尝试使用的 ReceiptViewModel ,首先就这样使用吧:

payments: data.receipt.payments,

然后这样:

payments: Object.entries(data.receipt.payments).map(([key, value]) => {
        return <PaymentViewModel>{
          CASH: value.CASH,
          CARD: value.CARD,
          VOUCHER: value.VOUCHER,
        };
      })

但没有一项工作和我希望发生的事情是能够像这样在 html 中使用它:

<tbody *ngFor="let payment of receipt.payments">
        <tr>
          <th>{{'models.Receipt.payments.paymentType.CASH' | translate}}</th>
          <th>{{payment.CASH}}</th>
        </tr>
        <tr>
          <th>{{'models.Receipt.payments.paymentType.CARD' | translate}}</th>
          <th>{{payment.CARD}}</th>
        </tr>
        </tbody>

【问题讨论】:

  • 收据是否包含有关不同产品的付款信息数组?
  • 我不确定我是否知道你在问什么,但收据中包含 ID 和其他信息以及付款等内容。 Payments 是一个具有我在问题顶部提到的值的对象。所以是的,收据 = { id= number,payments = SomeViewModel[],date = Date,}。此外,付款信息不是针对产品,而是针对整个收据。这是有关客户为所购买商品付款方式的信息
  • 我的意思是收据中只有一个付款对象还是多个付款对象,我问的是因为您提到您正在从服务器接收付款数据,但您没有提及您是否收到来自服务器的相同收据的不同付款信息或收据只有一个付款信息。
  • 是的,对不起,我会编辑它。我正在从服务器获取整个收据,正如我在之前的评论中提到的,收据包含一个包含不同支付类型数组的对象。所以假设有人用卡和 10 美元现金支付了 5 美元,收据内的对象将是 2 个数组,一个 CARD:5,另一个 CASH:10。
  • 我已经添加了答案,让我知道这是否会产生所需的行为

标签: angular


【解决方案1】:

据我了解,您希望在 * ngFor 中显示为收据完成的不同类型的付款,因此我的以下答案基于该假设

你说你收到了这个回复

paragonSequenceNumber: null
payments: {CARD: 4, CASH: 8}
pkp: "BBBBBBBBBBBBBBBBBBBBB"

你的 ReceiptDTO 是这样映射的

export interface ReceiptDTO {
        payments: {[key: string]: number }; // key: ReceiptPaymentType (enums)
}

到目前为止一切都很好 在这里我认为对于 ReceiptViewModel 你需要像这样更新

这里为 PaymentTypeInfo 做一个这样的接口

interface PaymentTypeInfo {
    paymentTypeName: string;
    paymentTypeValue: number;
}

然后指定类型

This is my ReceiptViewModel

interface ReceiptViewModel {
  payments: PaymentTypeInfo[]; // basically array donates the different type of payment like cash, card, etc. then for each index i.e type of payment, which contain the paymentTypeName and it's value
}

这是您提到的 PaymentViewModel

interface PaymentViewModel {
  CASH?: number;
  CARD?: number;
  VOUCHER?: number;
}

根据我们分配的付款价值,我们需要像这样更新这个

payments: Object.entries(data.receipt.payments).map((key, value) => {
    const currentPaymentTypeInfo : PaymentTypeInfo = {
        paymentTypeName : key,
        paymentTypeValue: value
    }
    return currentPaymentTypeInfo;
};

一旦完成,我们需要像这样更新html部分

<tbody *ngFor="let payment of receipt.payments" >
    <tr>
        <th>Payment-Type : {{payment.paymentTypeName}}</th>
        <th>It's value : {{payment.paymentTypeValue}}</th>
</tbody >

【讨论】:

  • 谢谢。但是现在我在付款中收到此消息: Object.entries(data.receipt.payments), ------------------------- TS2322: Type '[ string, number][]' 不能分配给类型 '[][]'。类型 '[string, number]' 不能分配给类型 '[]'。属性“长度”的类型不兼容。类型 '2' 不能分配给类型 '0'。------------------------- 它适用于 any[],但我应该离开是这样还是不好?
  • 还有没有比payment[0]和payment[1]更好的等待。像 payment.value 和 payment.key 这样的东西?
  • 我认为这是 typscript 抱怨未指定的付款类型:[][],如果您对付款类型始终存在哪种类型有信心,您可以定义这些或任何类型也可以,在这种情况下,由于数组不能有两种类型,any 会好得多,我也在更新类型安全的答案。
  • 嗯,我确定我一定会得到这 3 个中的任何一个:凭证、卡、现金。它不能是其他任何东西,也不能是任何东西。此外,由于未使用 PaymentViewModel,因此不需要存在
  • @C0mpl3x 是的,您可以创建一个具有属性的接口,例如“PaymentTypeInfo” - PaymentType 和 PaymentTypeValue,然后您可以创建像这样的支付数组“payments : PaymentTypeInfo []”
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 2019-06-03
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
相关资源
最近更新 更多