如何对变量内字符串子串形式的数字进行匹配求和?
实现带相同名称的数字+字符串变量合并方案
核心逻辑是先拆分每个字符串的数值和文本部分,再按文本部分分组累加数值,最后拼接为结果字符串。
步骤1:编写拆分字符串的工具函数
先把类似"1 apple"、"2 apple"这样的字符串拆成数值和食材名称两部分:
function parseIngredient(ingStr) { // 匹配开头的数字部分,剩下的内容全部作为食材名称(自动去除前后空格) const match = ingStr.match(/^(\d+)\s+(.*)$/); if (!match) return { count: 0, name: ingStr.trim() }; return { count: parseInt(match[1], 10), name: match[2].trim() }; }
步骤2:批量合并食材清单
支持2个及以上的食材合并,你可以把所有要合并的食材字符串放进数组统一处理:
function mergeIngredients(ingredientList) { const countMap = {}; // 遍历所有食材统计数量 ingredientList.forEach(ing => { const { count, name } = parseIngredient(ing); // 相同名称自动累加 countMap[name] = (countMap[name] || 0) + count; }); // 转换为最终结果数组,你可以自行接入已经写好的单复数处理逻辑 return Object.entries(countMap).map(([name, totalCount]) => { // 示例单复数逻辑,可替换为你自己的实现 return `${totalCount} ${name}${totalCount > 1 ? 's' : ''}`; }); }
步骤3:调用示例
let ingredient1 = 1 + " apple"; let ingredient2 = 2 + " apple"; // 支持任意数量的食材合并,新增其他品类食材也能自动分类统计 const totalIngredients = mergeIngredients([ingredient1, ingredient2]); console.log(totalIngredients); // 输出 ["3 apples"]
逻辑说明
- 正则拆分方式不受食材名带空格的影响,比如
"2 ice cream"也能正确识别名称为ice cream - 用对象做映射自动匹配相同食材,只有完全一致的食材名称才会累加,不会误合并不同品类
- 支持传入任意多的食材字符串,不需要单独适配两个变量的特殊情况
内容的提问来源于stack exchange,提问作者Ivan Gospodinov
相关产品推荐
相关产品推荐

