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
相关产品推荐
相关产品推荐

