我有一點問題,我不確定我哪里出錯了。我有一張地圖,它根據我需要添加折扣或跳過它的產品 ID 來引入價格。
let discountPrice = !prod.ProductID.startsWith('BGM', 'S11', 'BGP') && prod.CurrentPrice.toString().endsWith('97') ? parseFloat(prod.CurrentPrice) * 0.05 : !prod.ProductID.startsWith('BGM', 'S11', 'BGP') ? parseFloat(prod.CurrentPrice) * 0.15 : 0
let dp = usdNumber.format( discountPrice )
let finalPrice = parseFloat(prod.CurrentPrice) - parseFloat(discountPrice)
let totalWithQ = finalPrice * prod.Quantity
let fp = usdNumber.format( totalWithQ )
這對 BGM 非常有用,它會跳過折扣,但對于 S11 和 BGP,它仍然會應用折扣,如果產品 ID 有 BGM、S11 或 BGP,我希望它跳過。

我使用startsWith錯了嗎?它不能通過它傳遞多個東西并讓它回圈通過每個引數嗎?
{User?.Cart && User?.Cart.length > 0 && (
<>
<Table>
<Thead>
<Tr className="text-left border-b-2 border-blue">
<Th className="py-5">Product</Th>
<Th className="py-5">Price</Th>
<Th className="py-5">Overstock Discount Per Item</Th>
<Th className="py-5">Quantity</Th>
<Th className="py-5">Total Price</Th>
<Th className="py-5">Controls</Th>
</Tr>
</Thead>
<Tbody>
{User.Cart.map((prod, i) => {
let discountPrice = !prod.ProductID.startsWith('BGM', 'S11', 'BGP') && prod.CurrentPrice.toString().endsWith('97') ? parseFloat(prod.CurrentPrice) * 0.05 : !prod.ProductID.startsWith('BGM', 'S11', 'BGP') ? parseFloat(prod.CurrentPrice) * 0.15 : 0
let dp = usdNumber.format( discountPrice )
let finalPrice = parseFloat(prod.CurrentPrice) - parseFloat(discountPrice)
let totalWithQ = finalPrice * prod.Quantity
let fp = usdNumber.format( totalWithQ )
return (
<Tr
key={`key-cart-prod-${i}`}
className="border-b border-opacity-50 border-Blue"
>
<Td className="py-5">
<Link href={`/product/${prod.Slug}`}>
<a>
{`${prod.Description} (${prod.ProductID})`}
</a>
</Link>
</Td>
<Td className="py-5">{`$${prod.CurrentPrice}`}</Td>
<Td className="py-5">{`${dp}`}</Td>
<Td className="py-5">{`Qty: ${prod.Quantity}`}</Td>
<Td className="py-5">{`${fp}`}</Td>
<Td className="py-5" style={{width: '1%', whiteSpace: 'nowrap'}}>
<RemoveFromCart ProductID={prod.ProductID} />
</Td>
</Tr>
)
})}
</Tbody>
uj5u.com熱心網友回復:
無法將多個選項傳遞給 startsWith() 方法。
該方法具有以下語法:string.startsWith(searchValue, start)
你可以試試:
- 分別檢查每個字串的startsWith:
!(prod.ProductID.startsWith('BGM') || prod.ProductID.startsWith('S11') || prod.ProductID.startsWith('BGP'))
- 回圈遍歷選項陣列:
!['BGM', 'S11', 'BGP'].some(item => prod.ProductID.startsWith(item))
- 使用正則運算式:
!/^(BGM|S11|BGP)/.test(prod.ProductID)
uj5u.com熱心網友回復:
這根本不是startsWith的作業方式。您只能為它提供一個測驗字串(并且,可選且很少提供起始位置。)
嘗試更換
! prod.ProductID .startsWith ('BGM', 'S11', 'BGP')
和
! (['BGM', 'S11', 'BGP'] .some (s => prod .ProductID .startsWith (s)))
或等效地,
(['BGM', 'S11', 'BGP'] .every (s => ! prod .ProductID .startsWith (s)))
取決于哪個對您更有意義,并為您的CurrentPrice. 這可能會捕獲您需要的內容。
uj5u.com熱心網友回復:
String.prototype.startsWith,不能傳遞三個單獨的字串來檢查。
如果您的偽代碼是:
If product ID does not begin with BGM, S11, or BGP,
那么您可以使用正則運算式對其進行測驗,或者使用三個單獨的陳述句,如下所示:
let discountPrice = (!prod.ProductID.startsWith('BGM') &&
!prod.ProductID.startsWith('S11') &&
!prod.ProductID.startsWith('BGP') &&
prod.CurrentPrice.toString().endsWith('97'))
? parseFloat(prod.CurrentPrice) * 0.05
: !prod.ProductID.startsWith('BGM', 'S11', 'BGP')
? parseFloat(prod.CurrentPrice) * 0.15
: 0
使用正則運算式:
let discountPrice = (!/^(S11|BGP|BGM)/.test(prod.ProductID) && prod.CurrentPrice.toString().endsWith('97'))
? parseFloat(prod.CurrentPrice) * 0.05
: !prod.ProductID.startsWith('BGM', 'S11', 'BGP')
? parseFloat(prod.CurrentPrice) * 0.15
: 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/495144.html
標籤:javascript 反应
