Почему я получаю возвращаемые элементы вне массива, для которого я зациклен? - PullRequest
0 голосов
/ 15 декабря 2018

Учитывая массив, я пытаюсь вернуть последние четные числа вплоть до заданного «числа» элементов в новом массиве, его также необходимо вернуть в исходном порядке.Я написал следующий код:

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, 10], когда он должен вернуть [-8, 26]

Он правильно возвращает четные числа и число или четные числа Iхочу, но 8 и 10. даже нет в данном массиве.

Я думал, что мой цикл for настроен правильно.Он начинается в конце массива let i = array.length - 1;, продолжается до тех пор, пока это верно newarr.length < number; и повторяется один шаг за раз i-=1

Мой следующий вопрос: как мой цикл for узнает, какоймассив, который я хочу перебрать?Я новичок в JavaScript, так как я знаю Python, который использует «для я в массиве», поэтому он знает, какой массив / список вы перебираете.Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018
function evenNumbers(array, number) {
   let newarr = [];
   for (let i = array.length - 1; newarr.length < number; i--){
      if (array[i] % 2 == 0){
         newarr.push(array[i]);}}
   return newarr.reverse();}

   const az = evenNumbers([-22, 5, 3, 11, 26, -6, -7, -8, -9, -8, 26], 2);


   console.log(az);
0 голосов
/ 15 декабря 2018

Вам нужно проверить элемент 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));
...