Javascript 为什么数组的最后一个元素返回未定义,而不是将其剪接?

Javascript 为什么数组的最后一个元素返回未定义,而不是将其剪接?,javascript,Javascript,我正在做一个小练习: 问题是我想要这个: => ['kept','kept'] 但是,相反,我一直得到这个: => ['kept','kept'] 功能保持(数组、保持器){ //这将返回未定义和保留的数组 //=>[“保留”,未定义,“保留”,未定义,未定义] matchingNumbers=array.map(函数匹配(元素){ 如果(元素===保持器){ 返回元素; } }); //从matchingNumbers数组中删除所有未定义的 匹配长度=匹配编号.length;

我正在做一个小练习: 问题是我想要这个

=> ['kept','kept']
但是,相反,我一直得到这个

=> ['kept','kept']

功能保持(数组、保持器){
//这将返回未定义和保留的数组
//=>[“保留”,未定义,“保留”,未定义,未定义]
matchingNumbers=array.map(函数匹配(元素){
如果(元素===保持器){
返回元素;
}
});
//从matchingNumbers数组中删除所有未定义的
匹配长度=匹配编号.length;
对于(变量i=1;i

我试图将匹配数字中的所有未定义的与for循环拼接,那么为什么还有最后一个未定义的呢?

我猜是因为您从
1
开始
I
,而不是
0
。此外,正如@Wali所提到的,您在迭代数组时更改了数组长度。要解决此问题,请按相反顺序遍历数组:

for (var i = array.length; i > 0; i--) {
  ...
}

作为旁注,您可以使用而不是处理映射和拼接来实现您想要的。

我的猜测是因为您在
1
而不是
0
开始
i
。此外,正如@Wali所提到的,您在迭代数组时更改了数组长度。要解决此问题,请按相反顺序遍历数组:

for (var i = array.length; i > 0; i--) {
  ...
}

作为旁注,您可以通过使用而不是处理映射和拼接来实现所需的功能。

当函数不执行
return
语句时,默认情况下它会返回
undefined
array.map()
将函数的返回值放入结果数组中,这包括那些
未定义的值

您应该使用
array.filter
而不是
array.map

matchingNumbers = array.filter(function matching(element){
     return element === keeper;
});

当函数不执行
return
语句时,默认情况下会返回
undefined
array.map()
将函数的返回值放入结果数组中,这包括那些
未定义的值

您应该使用
array.filter
而不是
array.map

matchingNumbers = array.filter(function matching(element){
     return element === keeper;
});

您的
i
在每次迭代后都会递增,但您的数组同时会丢失元素,因此递增的
i
并不总是表示“下一个元素”。首先,数组从索引0开始。。。其次,如果您查看上面链接中的多边形填充,您将看到应该如何编写代码:p这实际上不是链接问题@xufoor
i
的重复。您的
i
在每次迭代后都会递增,但您的数组同时会丢失元素,因此递增的
i
并不总是意味着“下一个元素”.首先,数组从索引0开始。。。其次,如果你看一下上面链接中的Polyfill,你会看到你应该如何编写代码:p这不是链接问题的重复@xufit不是数组长度的变化,而是当你处理元素3并决定在3处拼接时,下一个测试的元素是4。。。但在拼接前的5分钟。。。原来的元素4现在是3,但是没有测试,因为i==4。。。可以在拼接后的if中使用
i--
,或者按照您的建议,向后循环。唯一的问题是当两个
未定义的
相邻时,这不是数组长度的变化,而是当您处理元素3并决定在3处拼接时,下一个测试的元素是4。。。但在拼接前的5分钟。。。原来的元素4现在是3,但是没有测试,因为i==4。。。可以在拼接后的if中使用
i--
,或者按照您的建议,向后循环。唯一的问题是当两个
未定义
相邻时,我想添加这一点,作为使用
数组的结果。filter
函数您甚至不必执行第二次循环就可以从列表中删除
未定义
。只要使用array.filter就足够了。如果使用正确,它不会将任何未定义的
添加到列表中。@JerrySaravia是的,这就是目的,它会替换他的所有代码。是的,我理解,只是想让Wali更明确。你的答案不太清楚,因为它没有包含完整的函数定义,也没有直接说明。我想补充一下,由于使用了
数组。filter
函数,你甚至不必进行第二次循环,就可以从列表中删除
未定义的
。只要使用array.filter就足够了。如果使用正确,它不会在列表中添加任何未定义的
。@JerrySaravia是的,这是他的意图,它会替换他的所有代码。是的,我理解,只是想让Wali明确。你的答案不太清楚,因为它不包括完整的函数定义,也没有直接说明。