Javascript 从类方法中的数组中删除元素

Javascript 从类方法中的数组中删除元素,javascript,class,Javascript,Class,我当时正在处理一个hackerrank问题,测试用例显示我的“remove”方法有问题。我总是没有定义,而不是真/假 我知道splice返回数组中已删除元素的数组。当我在map中输入console.log时,当我删除第一个元素时,看起来一切都很好,我得到了我期望的结果,除了true/false。但当我要删除的“name”不是第一个元素时,我并没有得到我期望得到的结果。你能帮我修一下吗?当然,我从不知道是真是假 班级统计表{ 建造师{ 这是。成员=[]; } 地址、年龄{ 如果年龄>20岁{ t

我当时正在处理一个hackerrank问题,测试用例显示我的“remove”方法有问题。我总是没有定义,而不是真/假

我知道splice返回数组中已删除元素的数组。当我在map中输入console.log时,当我删除第一个元素时,看起来一切都很好,我得到了我期望的结果,除了true/false。但当我要删除的“name”不是第一个元素时,我并没有得到我期望得到的结果。你能帮我修一下吗?当然,我从不知道是真是假

班级统计表{ 建造师{ 这是。成员=[]; } 地址、年龄{ 如果年龄>20岁{ this.members.pushname }否则{ 新员工年龄必须大于20岁 } } 改名{ this.members.mapitem,索引=>{ 如果此.members.includeName{ console.logname let removed=this.members.拼接项,1; 控制台。日志已删除 返回true; }否则{ 返回false; } } } getSize{ 返回此.members.length; } } 让我=新的统计表; i、 加上“michelle”,25岁 i、 加上'john',30; i、 加上'michael',30; i、 加上‘简’,26岁; i、 去掉“约翰”; console.logi 您的return语句被包装在.map中,在这种特殊情况下您会误用它,因此您基本上构建了true/false数组,但是您的remove方法不会返回任何内容

相反,我会提出一些建议,比如:

remove(name){
   const matchIdx = this.members.indexOf(name)
   if(matchIdx === -1){
     return false
   } else {
     this.members.splice(matchIdx, 1)
     return true
   }
}
您的return语句被包装在.map中,在这种特殊情况下您会误用它,因此您基本上构建了true/false数组,但是您的remove方法不会返回任何内容

相反,我会提出一些建议,比如:

remove(name){
   const matchIdx = this.members.indexOf(name)
   if(matchIdx === -1){
     return false
   } else {
     this.members.splice(matchIdx, 1)
     return true
   }
}
在remove方法中,将map与数组一起使用,该数组将运行作为每个数组元素的参数提供的函数。但我相信你不想这么做

使用下面的示例,基本上您要做的是检查数组是否包含名称“john”,如果是,则删除数组中出现的第一项,即“michelle”。这是因为map函数将从第一个元素开始为每个元素运行,然后使用该项从数组中删除。之后,它返回函数,不会删除其他元素

因此,我的建议是去掉map函数,直接在remove方法中运行其回调代码。您需要在数组中获取名称的索引,才能使用splice方法。

在remove方法中,您将map与数组一起使用,数组将运行您作为每个数组元素参数提供的函数。但我相信你不想这么做

使用下面的示例,基本上您要做的是检查数组是否包含名称“john”,如果是,则删除数组中出现的第一项,即“michelle”。这是因为map函数将从第一个元素开始为每个元素运行,然后使用该项从数组中删除。之后,它返回函数,不会删除其他元素


因此,我的建议是去掉map函数,直接在remove方法中运行其回调代码。您需要在数组中获取名称的索引才能使用splice方法。

不清楚为什么需要使用迭代逻辑删除项。您只需使用findIndex获取成员在数组中的位置。如果索引不是-1,则可以使用Array.prototype.sliceindex,1将其删除。请参见下面的概念验证示例:

班级统计表{ 建造师{ 这是。成员=[]; } 地址、年龄{ 如果年龄>20岁{ this.members.pushname }否则{ 新员工年龄必须大于20岁 } } 改名{ const index=this.members.findIndexx=>x==name; 如果索引!==-1{ 该指数为1; } } getSize{ 返回此.members.length; } } 让我=新的统计表; i、 加上“michelle”,25岁 i、 加上'john',30; i、 加上'michael',30; i、 加上‘简’,26岁; i、 去掉“约翰”;
console.logi 不清楚为什么需要使用迭代逻辑删除项。您只需使用findIndex获取成员在数组中的位置。如果索引不是-1,则可以使用Array.prototype.sliceindex,1将其删除。请参见下面的概念验证示例:

班级统计表{ 建造师{ 这是。成员=[]; } 地址、年龄{ 如果年龄>20岁{ this.members.pushname }否则{ 新员工年龄必须大于20岁 } } 改名{ const index=this.members.findIndexx=>x==name; 如果索引!==-1{ 这 s、 成员指数,1; } } getSize{ 返回此.members.length; } } 让我=新的统计表; i、 加上“michelle”,25岁 i、 加上'john',30; i、 加上'michael',30; i、 加上‘简’,26岁; i、 去掉“约翰”; console.logi 使用筛选方法而不是映射它更优雅,并且可以返回数组的其余部分,而不是true或false,除非您正在处理的问题特别需要true或false。 你可以这样写:

remove(name) {
   if (!this.members.some(el => el === name)) return false;
   this.members = this.members.filter(item => item !== name);
   return true;
}
使用筛选方法而不是映射它更优雅,并且可以返回数组的其余部分,而不是true或false,除非您正在处理的问题特别需要true或false。 你可以这样写:

remove(name) {
   if (!this.members.some(el => el === name)) return false;
   this.members = this.members.filter(item => item !== name);
   return true;
}

不正确地使用映射和拼接。对于接头,您并没有将索引传递给接头,而是错误地使用映射和接头传递元素值项。至于splice,您并没有将索引传递给splice,而是传递元素值item.findIndexx=>x==name=.indexofname,顺便说一句,您的remove方法仍然没有返回true/false.findIndexx=>x==name=.indexofname,而且,您的remove方法仍然没有返回true/false