我正在做一个小练习: 问题是我想要这个:
=> ['kept','kept']
但相反,我一直得到这个:
function keep(array, keeper) {
//This will return an array of undefined's and 'kept's
// =>[ 'kept', undefined, 'kept', undefined, undefined ]
matchingNumbers = array.map(function matching(element){
if (element === keeper) {
return element;
}
});
//Eliminate all undefined's from the matchingNumbers array
matchingLength = matchingNumbers.length;
for (var i = 1; i < matchingLength; i++) {
if(matchingNumbers[i] === undefined) {
(matchingNumbers.splice(i, 1));
}
}
return matchingNumbers;
}
keep(['kept', 'thirty', 'kept', 2, 1], 'kept')
我试图使用for循环拼接matchNumbers中的所有未定义的内容,那么为什么还有最后一个未定义的内容?
答案 0 :(得分:4)
当函数未执行return
语句时,默认情况下返回undefined
。 array.map()
将函数的返回值放入结果数组中,这包括undefined
个值。
您应该使用array.filter
代替array.map
:
matchingNumbers = array.filter(function matching(element){
return element === keeper;
});
答案 1 :(得分:2)
我的猜测是因为您在i
而不是1
开始0
。另外,正如@Wali所提到的,你在迭代它时会改变数组长度。要解决这个问题,请按相反顺序浏览数组:
for (var i = array.length; i > 0; i--) {
...
}
作为旁注,您可以使用Array.filter
实现所需,而不是处理映射和拼接。