作为一名热衷于健康科技的开发者,我注意到市场上存在一个空缺。虽然赛百味提供营养信息,但顾客缺乏一个互动工具来定制他们的确切餐点组合。我想创建一些能够让人们实时了解他们的餐点选择的工具,精确到最后一卡路里。
挑战很明确:构建一个全面的计算器,能够处理赛百味菜单的巨大变化性——从面包选择和蛋白质选择到每一种蔬菜和调味品,同时保持与官方营养数据的准确性。
我发现了一个由nutritionix开发的工具,它做同样的事情,这很好,但我想构建一些感觉更加用户友好的东西。
我的第一个任务是收集和构建营养数据。我花了几周时间收集赛百味的官方营养图表,标准化测量,并创建一个全面的JSON数据库。
结构需要既全面又高效:
const subwayMenu = { breads: [ { id: 'artisan-italian', name: '6" Artisan Italian Bread', calories: 210, totalFat: 2, saturatedFat: 1, // ... 14 additional nutritional fields }, // ... 10 more bread options ], // ... 9 additional categories };
\ 每个菜单项包含19个营养指标,确保我们可以显示完整的FDA风格营养标签,而不仅仅是卡路里。
核心复杂性在于管理用户的选择状态。赛百味订单不是简单的选择——它是一个多维组合:
let currentSelection = { sandwichSize: '6inch', bread: null, proteins: {}, cheeses: {}, vegetables: {}, condiments: {}, // ... with quantities for each };
\ 我实现了一个基于数量的系统,用户可以添加多份蛋白质、奶酪或蔬菜。"footlong"乘数必须自动将适当的组件加倍,同时保持其他组件(如沙拉)不受影响。
为确保计算器可以在任何网站上工作而不会有CSS冲突,我使用了一种范围方法:
#subway-calculator-isolated { all: initial; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', ...; } #subway-calculator-isolated * { box-sizing: border-box; margin: 0; padding: 0; }
\ all: initial重置和高z-index(99999)确保计算器无论主机站点的样式如何都能一致地呈现。
该工具使用赛百味官方2025年营养信息,包括最近添加的如Ghost Pepper面包和更新的沙拉配方。每个数据点都与赛百味的PDF营养指南和网站数据进行了验证。
数据库不仅包括卡路里,还包括:
计算引擎必须处理复杂场景:
function calculateTotalNutrition() { let total = { calories: 0, totalFat: 0, /* ... */ }; const sizeMultiplier = currentSelection.sandwichSize === 'footlong' ? 2 : 1; // Bread calculation (size-dependent) if (currentSelection.bread) { addItemNutrition(total, bread, currentSelection.bread.quantity * sizeMultiplier); } // Proteins, cheeses, vegetables (size-dependent) ['proteins', 'cheeses', 'vegetables'].forEach(category => { // Apply size multiplier }); // Soups, desserts (size-independent) ['soups', 'desserts'].forEach(category => { // No size multiplier }); return { nutrition: total, ingredients }; }
我复制了精确的FDA营养标签格式,基于2,000卡路里饮食(用户可调整)计算每日值百分比:
const fdaDailyValues = { totalFat: 78, saturatedFat: 20, cholesterol: 300, sodium: 2300, totalCarbs: 275, dietaryFiber: 28, addedSugars: 50, protein: 50, vitaminA: 900, vitaminC: 90, calcium: 1300, iron: 18 };
% Daily Value计算使用这些官方FDA参考量,确保监管合规。
手风琴式下拉菜单与实时计数器解决了复杂性问题:
每个用户操作触发多个更新:
进度条使用颜色编码(绿色→黄色→红色)直观地指示餐点如何符合每日目标。
计算器使用CSS Grid和Flexbox与战略性断点:
@media (max-width: 768px) { .calculator-container { flex-direction: column; } .item-with-quantity { flex-direction: column; } .goal-setting-content { grid-template-columns: 1fr; } }
在移动设备上,项目垂直堆叠,营养标签保持可读性而无需水平滚动。
导出功能生成详细的文本报告,包括:
window.subwaySaveNutritionInfo = function() { const summary = ` ============================================================ SUBWAY NUTRITION CALCULATOR - MEAL SUMMARY ============================================================ MEAL DETAILS: ------------- Size: ${sizeText} Total Calories: ${Math.round(nutrition.calories)} Daily Calorie Goal: ${userSettings.dailyCalorieGoal} calories Percentage of Daily Goal: ${Math.round((nutrition.calories / userSettings.dailyCalorieGoal) * 100)}% `; // ... generates downloadable file };
每个营养值都与以下内容交叉引用:
模块化JSON结构允许在赛百味进行以下操作时轻松更新:
该工具包括注释(**)用于可能有区域变化的项目,建议用户在可用时查看当地营养信息。
构建赛百味营养计算器不仅仅是一个编码项目——它是关于在食物选择中创造透明度。通过结合准确的官方营养数据与直观的界面,我们使用户能够对他们的餐点做出明智的决定。
该工具展示了网络技术(HTML、CSS、JavaScript)如何创建强大的交互式应用程序,弥合企业数据与消费者理解之间的差距。每一行代码都服务于最终目标:帮助人们准确了解他们正在吃什么,以便他们可以将赛百味选择与健康目标保持一致。
计算器仍然是一个活跃的项目,计划扩展其功能,同时保持对准确性和可用性的核心承诺,这已经使它对数千用户有价值。
计算器链接:赛百味卡路里计算器:计算卡路里享受三明治 - 赛百味卡路里计算器
\ \


