JavaScript判断对象数组是否存在姓名和年龄都相同的重复元素及代码修复
问题原因
你的代码存在两个核心逻辑错误:
- 把所有重名条目的年龄放在统一数组里查重,会出现「不同姓名但年龄相同」的误判
- 最终判断是否报错的条件仍然用的是重名数组的长度,完全没用到年龄查重的结果,所以只要有重名就会输出error
修正后代码
const data = [ {id: 1,name: "Liam",age: 20}, {id: 2,name: "Liam",age: 18}, {id: 3,name: "Noah",age: 20}, {id: 4,name: "Noah",age: 18}, {id: 5,name: "Elijah",age: 18} ] function checked() { // 按姓名分组,存储每个姓名对应的所有年龄 const nameAgeMap = {} let hasDuplicate = false for (const item of data) { if (!nameAgeMap[item.name]) { nameAgeMap[item.name] = [] } // 检查当前姓名下是否已经有相同年龄 if (nameAgeMap[item.name].includes(item.age)) { hasDuplicate = true break } nameAgeMap[item.name].push(item.age) } console.log(hasDuplicate ? 'error' : 'save') } checked()
逻辑说明
- 遍历数组时按照姓名分组,每个姓名对应一个存储年龄的数组
- 每遍历一个条目,先检查对应姓名的年龄数组里是否已经存在当前年龄:存在则直接标记有重复,终止遍历
- 最终根据是否存在「姓名+年龄都重复」的条目输出对应结果
你提供的测试数据中所有重名条目年龄都不重复,运行代码会输出save。如果新增一条{id:6,name:"Liam",age:20}的条目,运行就会输出error。
内容的提问来源于stack exchange,提问作者Good
相关产品推荐
相关产品推荐

