Vue.js对象数组重复值判断问题:新增正常更新误判重复
解决新增/更新时重复值判断的问题
我来帮你搞定这个问题,核心原因是你的代码没有区分新增和更新场景下的重复判断逻辑——更新时你需要排除当前正在编辑的那条数据本身,不然它自己的name肯定和待更新的name一致,就会误判为重复。
问题根源分析
原代码存在两个关键问题:
- 条件逻辑错误:
item.id && this.item.name === item.name只会检查带有id的item,但新增场景下你需要检查所有item的name是否重复,不管它们有没有id - 更新场景未排除自身:编辑已有数据时,遍历到这条数据本身时,name必然和待更新的name相同,这时候应该跳过它,而不是判定为重复
修正后的代码
this.duplicate = false; for(let item of this.items){ // 核心逻辑:新增时只要name重复就触发;更新时排除当前编辑的item(id不同才判定重复) if(this.item.name === item.name && (this.item.id === null || item.id !== this.item.id)) { this.$notify({ group: "notify", text: "Duplicate value! ", type: "error" }); this.duplicate = true; break; // 找到重复就停止遍历,优化性能 } } if(!this.duplicate){ // post/put 请求 }
代码逻辑说明
- 新增场景(
this.item.id === null):条件简化为this.item.name === item.name,只要items中存在任意item的name与待插入name一致,就判定为重复 - 更新场景(
this.item.id有值):条件变为this.item.name === item.name && item.id !== this.item.id,只有当其他item的name与待更新name一致时,才判定为重复,自己和自己的name相同不会触发提示 - 加入
break是为了避免不必要的遍历,一旦找到重复项就停止循环,提升代码运行效率
更简洁的写法(可选)
如果items数据量较大,推荐使用Array.some()方法替代for循环,代码更简洁易读:
const isDuplicate = this.items.some(item => this.item.name === item.name && (this.item.id === null || item.id !== this.item.id) ); if(isDuplicate){ this.$notify({ group: "notify", text: "Duplicate value! ", type: "error" }); } else { // post/put 请求 }
some()方法会在找到第一个满足条件的元素时立即返回true,和加break的效果一致,同时减少了冗余的变量声明。
内容的提问来源于stack exchange,提问作者Beusebiu
相关产品推荐
相关产品推荐

