export const equivalentUnits = { kg: { kgs: 1, kilograms: 1, kilogram: 1, g: 1000, gram: 1000, grams: 1000, lb: 2.20462, lbs: 2.20462, pound: 2.20462, pounds: 2.20462, }, litres: { l: 1, liter: 1, litre: 1, ml: 1000, milliliters: 1000, milliliter: 1000, 'fl oz': 33.814, 'fluid ounce': 33.814, 'fluid ounces': 33.814, cup: 4.22675, cups: 4.22675, tbsp: 67.628, tablespoon: 67.628, tablespoons: 67.628, tsp: 202.884, teaspoon: 202.884, teaspoons: 202.884, pt: 2.11338, pint: 2.11338, pints: 2.11338, qt: 1.05669, quart: 1.05669, quarts: 1.05669, gal: 0.264172, gallon: 0.264172, gallons: 0.264172, oz: 35.1951, ounce: 35.1951, }, items: { item: 1, items: 1, pcs: 1, piece: 1, pieces: 1, florets: 8, // Broccoli head: 1, // Broccoli heads: 1, // Broccoli slice: 10, // Bread slices: 10, // Bread loaf: 1, // Bread loaves: 1, // Bread cloves: 8, // Garlic bulb: 1, // Garlic bulbs: 1, // Garlic stalk: 1, // Celery stalks: 1, // Celery bunch: 1, // Cilantro bunches: 1, // Cilantro sprig: 1, // Cilantro sprigs: 1, // Cilantro cans: 1, // Canned goods can: 1, // Canned goods pack: 1, // Packaged goods packs: 1, // Packaged goods package: 1, // Packaged goods packages: 1, // Packaged goods container: 1, // Packaged goods containers: 1, // Packaged goods }, } function getBaseUnit(unit) { for (const unitType in equivalentUnits) { if (unit in equivalentUnits[unitType]) { return unitType } } return null } export function getConversionFactor(unit) { if (unit in equivalentUnits) { return { unit, factor: 1 } } const unitLower = unit.toLowerCase() if (unitLower in equivalentUnits) { return { unit: unitLower, factor: 1 } } const baseUnit = getBaseUnit(unit) if (baseUnit) { return { unit: baseUnit, factor: equivalentUnits[baseUnit][unit], } } const baseUnitLower = getBaseUnit(unitLower) if (baseUnitLower) { return { unit: baseUnitLower, factor: equivalentUnits[baseUnitLower][unitLower], } } return null } export function calculateTotals(quantityList) { const totals = {} for (const quantity of quantityList) { const baseUnit = getConversionFactor(quantity.unit) ?? { unit: quantity.unit, factor: 1 } const factor = baseUnit.factor const unit = baseUnit.unit if (!totals[unit]) { totals[unit] = 0 } totals[unit] += quantity.quantity / factor } return Object.keys(totals).map((unit) => ({ unit, quantity: totals[unit] })) }