如何根据请求国家动态更新静态Payload中各字段的货币符号?
问题:如何根据指定国家和orderId处理静态Payload
给定如下静态Payload,当传入指定国家(例如意大利)及orderId(例如11111101)时,需在保持Payload结构不变的前提下完成两项操作:
- 按orderId过滤数据,仅保留匹配的订单
- 将所有格式化价格字段中的货币符号替换为对应国家的符号
静态Payload示例
[ { "orderId": "11111101", "details": { "TotalPrice": { "NetPrice__c": 11.11, "NetPriceFormatted__c": "11,11 $" }, "TotalCartValue__c": 11.11, "TotalCartValueFormatted__c": "11,11 $", "TotalTaxPrice__c": 11.11, "TotalTaxPriceFormatted__c": "11,11 $", "TotalDiscountPrice__c": 11.11, "TotalDiscountPriceFormatted__c": "11,11 $", "products": [ { "SKUNumber__c": "111111-01", "Quantity": "1", "UnitPrice": 11.11, "UnitPriceFormatted__c": "11,11 $", "TotalPrice": 11.11, "TotalPriceFormatted__c": "11,11 $", "Discount__c": 11.11, "DiscountFormatted__c": "11,11 $", "ProductName__c": "Apple", "MachineFriendlyName__c": "iPhone", "DiscountValue__c": 11.11, "bundles": [] } ], "shippingModes": [ "ClickAndCollect", "ScheduledDelivery", "StandardDelivery" ], "TotalItems__c": 1, "PromoCode__c": null, "PromoStatus__c": null } }, { "orderId": "22222202", "details": { "TotalPrice": { "NetPrice__c": 22.22, "NetPriceFormatted__c": "22,22 $" }, "TotalCartValue__c": 22.22, "TotalCartValueFormatted__c": "22,22 $", "TotalTaxPrice__c": 22.22, "TotalTaxPriceFormatted__c": "22,22 $", "TotalDiscountPrice__c": 22.22, "TotalDiscountPriceFormatted__c": "22,22 $", "products": [ { "SKUNumber__c": "222222-02", "Quantity": "1", "UnitPrice": 22.22, "UnitPriceFormatted__c": "22,22 $", "TotalPrice": 22.22, "TotalPriceFormatted__c": "22,22 $", "Discount__c": 22.22, "DiscountFormatted__c": "22,22 $", "ProductName__c": "Samsung", "MachineFriendlyName__c": "Galaxy", "DiscountValue__c": 22.22, "bundles": [] } ], "shippingModes": [ "ClickAndCollect", "ScheduledDelivery", "StandardDelivery" ], "TotalItems__c": 1, "PromoCode__c": null, "PromoStatus__c": null } } ]
处理示例结果
当指定国家为意大利、orderId为11111101时,处理后的结果如下:
[ { "orderId": "11111101", "details": { "TotalPrice": { "NetPrice__c": 11.11, "NetPriceFormatted__c": "11,11 €" }, "TotalCartValue__c": 11.11, "TotalCartValueFormatted__c": "11,11 €", "TotalTaxPrice__c": 11.11, "TotalTaxPriceFormatted__c": "11,11 €", "TotalDiscountPrice__c": 11.11, "TotalDiscountPriceFormatted__c": "11,11 €", "products": [ { "SKUNumber__c": "111111-01", "Quantity": "1", "UnitPrice": 11.11, "UnitPriceFormatted__c": "11,11 €", "TotalPrice": 11.11, "TotalPriceFormatted__c": "11,11 €", "Discount__c": 11.11, "DiscountFormatted__c": "11,11 €", "ProductName__c": "Apple", "MachineFriendlyName__c": "iPhone", "DiscountValue__c": 11.11, "bundles": [] } ], "shippingModes": [ "ClickAndCollect", "ScheduledDelivery", "StandardDelivery" ], "TotalItems__c": 1, "PromoCode__c": null, "PromoStatus__c": null } } ]
解决方案(JavaScript实现)
1. 定义货币符号映射表
提前维护国家与对应货币符号的映射关系:
const currencyMap = { '意大利': '€', '美国': '$', '德国': '€', // 可按需扩展更多国家 };
2. 按orderId过滤订单
从原始Payload中筛选出匹配目标orderId的订单:
function filterOrderByOrderId(payload, targetOrderId) { return payload.filter(order => order.orderId === targetOrderId); }
3. 递归替换货币符号
由于格式化价格字段分布在多层嵌套结构中,使用递归遍历替换所有以Formatted__c结尾的字段的货币符号:
function replaceCurrencySymbol(obj, targetSymbol) { for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; // 匹配格式化价格字段,替换末尾的货币符号 if (typeof value === 'string' && key.endsWith('Formatted__c')) { // 通用正则:替换末尾非数字、非逗号的字符 obj[key] = value.replace(/[^\d,]+$/, targetSymbol); } // 递归处理嵌套对象或数组 else if (typeof value === 'object' && value !== null) { replaceCurrencySymbol(value, targetSymbol); } } } return obj; }
4. 整合逻辑得到结果
将过滤和替换逻辑组合,生成最终处理后的Payload:
// 原始静态Payload const originalPayload = [/* 填入原始Payload数据 */]; // 目标参数 const targetCountry = '意大利'; const targetOrderId = '11111101'; // 执行处理 const filteredOrders = filterOrderByOrderId(originalPayload, targetOrderId); const targetSymbol = currencyMap[targetCountry] || '$'; // 默认符号为$ const processedPayload = filteredOrders.map(order => replaceCurrencySymbol({...order}, targetSymbol)); // 输出结果 console.log(JSON.stringify(processedPayload, null, 2));
注意事项
- 递归逻辑可覆盖所有层级的格式化价格字段,无需手动处理嵌套结构
- 货币映射表可根据业务需求随时扩展
- 正则表达式可根据原始Payload中的货币符号格式调整,确保替换准确
内容的提问来源于stack exchange,提问作者JayR
相关产品推荐
相关产品推荐

