You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript项目lastIndexOf失效 无法阻止Ingredient重复添加

问题根因

你的代码重复添加元素的核心原因是lastIndexOf的使用逻辑错误:

  • this.ingredients是Ingredient类型的对象数组,每个元素是包含name、amount属性的对象,不是字符串值
  • 你传入item.name(字符串类型)调用lastIndexOf时,本质是拿字符串和数组里的对象做全等匹配,永远不可能命中已有项,所以判断条件恒为true,重复元素会被持续推入数组
  • 额外的逻辑问题:filter方法的作用是过滤数组并返回新的筛选结果,你在这里只做遍历副作用操作,不需要使用filter,用普通遍历方法更合理;代码里的@ts-ignore是在掩盖类型不匹配的错误,TS的类型提示本来已经在提醒你传参类型不对了,忽略类型检查只会把问题留到运行时。
正确实现

实现逻辑完全匹配需求:同名食材不重复添加,已存在则累加amount值,不存在则推入新项:

addIngredients(ingredients: Ingredient[] | undefined) {
  // 入参为空直接终止执行
  if (!ingredients) return;

  ingredients.forEach(item => {
    // 匹配现有数组中name相同的食材索引
    const existingItemIndex = this.ingredients.findIndex(
      ingredient => ingredient.name === item.name
    );

    if (existingItemIndex === -1) {
      // 不存在同名食材,直接添加
      this.ingredients.push(item);
    } else {
      // 存在同名食材,累加数量
      this.ingredients[existingItemIndex].amount += item.amount;
    }
  });
}

补充说明:lastIndexOf/indexOf适合匹配原始值类型(字符串、数字、布尔值)的数组,如果你要匹配对象数组的某个属性,需要用findIndex自定义匹配规则,不要直接传属性值调用索引查找方法。

内容的提问来源于stack exchange,提问作者GettingStarted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:45:40