【问题标题】:Why does the last element of my array return undefined, rather than splicing it off? [duplicate]为什么我的数组的最后一个元素返回未定义,而不是拼接它? [复制]
【发布时间】:2017-07-15 22:58:15
【问题描述】:

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

=> ['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')

我正在尝试将所有未定义的 matchNumbers 与 for 循环拼接,那么为什么还有最后一个未定义的剩余?

【问题讨论】:

  • 您的i 在每次迭代后都会增加,但您的数组同时会丢失元素,因此增加的i 并不总是意味着“下一个元素”。
  • 首先,数组从索引 0 开始...其次,Array#filter
  • 如果您查看上面链接中的 Polyfill,您将了解您应该如何编写代码:p
  • 这不是链接问题@Xufo的真正副本

标签: javascript


【解决方案1】:

当函数不执行return 语句时,默认返回undefinedarray.map() 将函数的返回值放入结果数组中,这包括那些 undefined 值。

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

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

【讨论】:

  • 我想补充一点,因为使用了array.filter 函数,您甚至不必执行第二个循环即可从列表中删除undefineds。只需使用 array.filter 就足够了。如果使用正确,它不会将任何undefined 添加到列表中。
  • @JerrySaravia 是的,这就是意图,这将替换他的所有代码。
  • 是的,我明白了,只是想为 Wali 明确说明。你的答案不太清楚,因为它不包括完整的函数定义,也没有直接说明.
【解决方案2】:

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

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

附带说明,您可以使用Array.filter 实现您想要的,而不是处理映射和拼接。

【讨论】:

  • 这不是数组长度的变化,而是当您处理元素 3 并决定在 3 处拼接时,下一个测试的元素是 4 ......但以前是5 在拼接之前......所以原来的元素 4 现在是 3,但这没有经过测试,因为 i == 4 ...一个可以i-- 在拼接之后的 if 中,或者按照你的建议,向后循环。唯一的问题是当有两个 undefined 相邻时
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多