首页 > 解决方案 > 为什么我要在要循环的数组之外获取返回元素?

问题描述

给定一个数组,我试图将最后一个偶数返回到一个新数组中给定“数量”的项目,它还需要按原始顺序返回。我写了以下代码:

function evenNumbers(array, number) {
   let newarr = [];
   for (let i = array.length - 1; newarr.length < number; i-=1){
      if (i % 2 == 0){
         newarr.push(i);}}
   return newarr.reverse();}

所以我试图从给定数组的后面开始,只将偶数插入一个新数组,直到新数组的给定“数字”长度的长度,并以原始顺序返回它们。它似乎工作正常,除了在少数情况下它返回的数组包含不在我循环的原始数组中的数字。我错过了什么?

例如:evenNumbers([-22, 5, 3, 11, 26, -6, -7, -8, -9, -8, 26], 2)

当它应该返回 [-8, 26] 时返回 [8, 10]

它正确返回偶数和我想要的数字或偶数,但 8 和 10 甚至不在给定的数组中。

我以为我的 for 循环设置正确。它从数组的后面开始,如果let i = array.length - 1;这是真的,它会继续,newarr.length < number;并且一次向后迭代一步i-=1

我的后续问题是我的 for 循环如何知道我要迭代哪个数组?我对 javascript 比较陌生,因为我知道 Python 使用“for i in array”,所以它知道您正在迭代哪个数组/列表。谢谢!

标签: javascriptarraysfor-loopreverse

解决方案


您需要测试元素array[i],而不是索引,如有必要,稍后再进行测试。

然后你需要添加一个检查,如果索引将是负数并停止迭代。

最后你可以使用Array#unshift而不是Array#push和省略倒车。

function evenNumbers(array, number) {
    let newarr = [];
    for (let i = array.length - 1; newarr.length < number && i >= 0; i -= 1) {
        if (array[i] % 2 === 0) {
            newarr.unshift(array[i]);
        }
    }
    return newarr;
}

console.log(evenNumbers([-22, 5, 3, 11, 26, -6, -7, -8, -9, -8, 26], 2));
console.log(evenNumbers([], 2));

一种带有while循环和隐式检查的较短方法。

function evenNumbers(array, number) {
    var newarr = [],
        i = array.length;

    while (i-- && newarr.length < number) {
        if (array[i] % 2 === 0) {
            newarr.unshift(array[i]);
        }
    }
    return newarr;
}

console.log(evenNumbers([-22, 5, 3, 11, 26, -6, -7, -8, -9, -8, 26], 2));
console.log(evenNumbers([], 2));


推荐阅读