Почему мой массив возвращается к тесту пустым? - PullRequest
0 голосов
/ 07 февраля 2020

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

  ● powers › generates sequences of powers properly

    expect(received).toEqual(expected) // deep equality

    - Expected  - 3
    + Received  + 1

    - Array [
    -   1,
    - ]
    + Array []

      82 |     expect(generatorToArray(powers, 2, -5)).toEqual([]);
      83 |     expect(generatorToArray(powers, 7, 0)).toEqual([]);
    > 84 |     expect(generatorToArray(powers, 3, 1)).toEqual([1]);
         |                                            ^
      85 |     expect(generatorToArray(powers, 2, 63)).toEqual([1, 2, 4, 8, 16, 32]);
      86 |     expect(generatorToArray(powers, 2, 64)).toEqual([1, 2, 4, 8, 16, 32, 64]);
      87 |   });

      at Object.<anonymous> (h2.test.js:84:44)

  console.log h2.js:41
    []

  console.log h2.js:41
    []

  console.log h2.js:41
    [ 1 ]

Идея состоит в том, чтобы он возвращал все степени числа x до определенной точки y. Как вы можете видеть, console.log показывает массив как имеющий [1], в то время как он возвращается в тест как [] пустой. Вот исходный код:

function powers(x, y){
    let count = 0;
    let z = new Array();
    while(Math.pow(x,count)<=y){
        z.push(Math.pow(x,count));
        count+=1;
    }
    console.log(z);
    return z;
}

Я ломал голову, и я искренне понятия не имею, что может быть не так с этим. Пожалуйста, помогите!

РЕДАКТИРОВАТЬ: Вот функция generatorToArray, все тесты были предоставлены профессором, поэтому я не думаю, что мне разрешено их менять.

function generatorToArray(generator, ...args) {
  const result = [];
  generator(...args, (item) => result.push(item));
  return result;
}

1 Ответ

0 голосов
/ 07 февраля 2020

Является ли generatorToArray функцией, которая должна быть такой, и вы не можете ее изменить? Если это так, функция ожидает, что generator - функция power - будет иметь последний аргумент, вызываемый как обратный вызов с результатом.

Т.е. генератор должен генерировать результаты - для этого и нужен обратный вызов - обратный вызов вызывается для каждого сгенерированного частичного результата. Затем функция generatorToArray собирает эти сгенерированные частичные результаты в массив.

Таким образом, функция power не должна создавать свой собственный массив, она должна просто вызывать обратный вызов с каждым частичным результатом:

function powers(x, y, callback){
    let count = 0;
    while(Math.pow(x,count)<=y){
        callback(Math.pow(x,count));
        count+=1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...