JavaScript二维数组删除成员后添加提示已存在的问题解决
解决删除成员后仍提示已存在的问题
删除成员操作执行后,尝试添加同名新成员时系统仍提示“该成员已存在”,但实际上已从memberGroup中删除了对应成员。
相关代码片段
删除成员代码
var memberName = input.question("Please enter member's name: "); memberName = memberName.substring(0, 1).toUpperCase() + memberName.substring(1).toLowerCase(); subMemberGroups(); if (subMemberGroup.includes(memberName)) { const memberGroupIndex = memberGroup.findIndex((e) => e.name === memberName) if (memberGroupIndex !== -1) { memberGroup.splice(memberGroupIndex, 1); // if exists remove it console.log("Member deleted!\n"); } else { console.log("Member does not exist.\n"); } } else { console.log("Member does not exist.\n"); } choices();
添加成员代码
while (true) { var memberName = input.question("Please enter member's name: "); memberName = memberName.substring(0, 1).toUpperCase() + memberName.substring(1).toLowerCase(); subMemberGroups(); if (subMemberGroup.includes(memberName)) { console.log ("\nMember's name exists in database. Please enter a new name."); } else { var memberDOB = input.question("Please enter member's date of birth: "); var memberDJ = input.question("Please enter member's date joined: "); var userNew = new Member (memberName, 'Ruby', memberDJ, memberDOB, 0); memberGroup.push(userNew); break; } }
subMemberGroups函数
function subMemberGroups() { for (var i = 0; i < memberGroup.length; i++) { subMemberGroup.push(memberGroup[i]["name"]); } }
初始化代码
memberGroup = [userJohn, userLemuel]; subMemberGroup = ['John', 'Samuel']; var userJohn = ['John', '20']; var userLemuel = ['Lemuel', '22']; var userJohn = new Member ['John', '24'];
问题原因及修复方案
核心问题
subMemberGroups函数每次调用时,只会往subMemberGroup数组里追加成员名字,不会清空之前的内容。删除成员后,memberGroup里的对应项被移除,但subMemberGroup中仍保留着已删除的名字,导致添加成员时判断错误。
另外初始化代码存在变量声明顺序颠倒、构造函数调用错误(new Member ['John', '24']应为new Member('John', ...))、重复声明变量的问题,这些也会导致数据混乱。
修复步骤
- 修复
subMemberGroups函数,每次调用前清空数组
function subMemberGroups() { // 先清空旧数据,再重新生成最新名字列表 subMemberGroup = []; for (var i = 0; i < memberGroup.length; i++) { subMemberGroup.push(memberGroup[i].name); } }
这样每次调用都会基于最新的memberGroup生成纯净的名字列表,不会残留旧数据。
- 修正初始化代码的错误
// 先声明并初始化成员实例 var userJohn = new Member('John', 'Ruby', '2023-01-01', '1999-01-01', 20); var userLemuel = new Member('Lemuel', 'Ruby', '2023-02-01', '2000-02-01', 22); // 初始化主数组和名字数组 memberGroup = [userJohn, userLemuel]; subMemberGroup = []; // 首次生成名字列表 subMemberGroups();
- 调整变量声明顺序,避免引用未定义的变量
- 修正构造函数调用方式,使用括号传递参数
- 初始化
subMemberGroup为空数组,通过subMemberGroups()生成正确的初始名字列表
- 优化删除逻辑(可选)
删除时可以直接根据memberGroupIndex判断,无需先查subMemberGroup,减少冗余判断:
var memberName = input.question("Please enter member's name: "); memberName = memberName.substring(0, 1).toUpperCase() + memberName.substring(1).toLowerCase(); const memberGroupIndex = memberGroup.findIndex((e) => e.name === memberName); if (memberGroupIndex !== -1) { memberGroup.splice(memberGroupIndex, 1); // 删除后立即更新名字列表 subMemberGroups(); console.log("Member deleted!\n"); } else { console.log("Member does not exist.\n"); } choices();
这样删除后直接更新subMemberGroup,确保数据一致性。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

