为什么我的数组的最后一个元素返回undefined,而不是拼接它?

时间:2017-02-24 23:33:10

标签: javascript

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

=> ['kept','kept']

但相反,我一直得到这个

this answer

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中的所有未定义的内容,那么为什么还有最后一个未定义的内容?

2 个答案:

答案 0 :(得分:4)

当函数未执行return语句时,默认情况下返回undefinedarray.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实现所需,而不是处理映射和拼接。