Функция для создания нового массива, производящего неопределенный - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь написать программу, которая создает массив и заполняет его диапазоном чисел.Переменные x, y, z диапазона функции соотносятся с начальным номером, конечным номером и числовым значением каждого шага.Моя цель - создать массив со всеми числами между (и включая) x и y, который создается с каждым шагом.Вот код:

let newarray = []

function range (x, y, z){
  if (x === undefined || y === undefined || z === undefined || (x > y) || (z < 0)) {
    return newarray;                          // returns empty array if x, y, or z is undefined, x is greater than y or z is a negative integer
  }
  else if (y > x) {
    for (x; x < y; x = x += z) {
      newarray.push(x);                       //pushes x into an array then adds z into x and loops until x exceeds y
    }
  } 
  else {
    return newarray;                          //prints out new array
  }
}

console.log(range(0, 10, 2));
console.log(range(10, 30, 5));
console.log(range(-5, 2, 3));

сейчас он производит неопределенное значение для всех трех чисел.Мое исследование предполагает что-то об асинхронности?Я не уверен, что это значит.

Ответы [ 3 ]

0 голосов
/ 25 августа 2018
  • Блок else не требуется, так как он будет недоступен и будет возврат undefined.

  • Исправлено x = x + z из x = x += z.

  • Объявление массива было вне, поэтому каждый раз старые данные будут добавлены новые данные из цикла for.

 function range (x, y, z){

      let newarray = [];

      if (x === undefined || y === undefined || z === undefined ||  (x > y) || (z < 0)){
        return newarray;    
      }
      else if (y > x) { 
       for (x; x < y; x = x + z){
           newarray.push(x); 
        }
      }    
    return newarray;
      
    }
    console.log(range(0, 10, 2));
    console.log(range(10, 30, 5));
    console.log(range(-5, 2, 3));
0 голосов
/ 25 августа 2018

Здесь есть несколько вещей:

  1. newArray следует определять внутри области действия функции, а не как глобальную переменную. В противном случае последующие вызовы функции будут продолжать добавляться в тот же массив, что, скорее всего, не является вашим намерением (и, если это так, есть array.concat() для этого).

  2. Ваш последний else недоступен, поэтому функция либо возвратит пустой массив для ввода, не прошедшего проверку, либо вернет undefined, когда управление достигнет конца функции после заполнения массива в else if блок.

  3. x = x += z, вероятно, обозначается как x += z.

  4. Вы должны запретить z === 0 в противном случае вы получите бесконечный цикл.

  5. Обычный стиль JS - camelCase имен переменных.

Кроме того, мне легче написать положительных условных выражений, чем отрицательных условных. В этом случае перечисление разрешенных аргументов кажется наиболее чистым. Этот подход позволяет использовать только один оператор return и меньшее количество условных переходов, что уменьшает потенциальную путаницу.

Вот версия, которая решает эти проблемы:

function range(x, y, z) {
  const newArray = [];
  
  if ([x, y, z].indexOf(undefined) < 0 && x < y && z > 0) {
    for (; x < y; x += z) {
      newArray.push(x);
    }
  } 
  
  return newArray;
}

console.log(range(0, 10, 2));
console.log(range(10, 30, 5));
console.log(range(-5, 2, 3));
0 голосов
/ 25 августа 2018

Обратите внимание, что раздел, где вы проверяете else if (y > x), не имеет возврата. Когда это условие истинно, ваша функция возвращает undefined. Чтобы устранить проблему, просто добавьте return newarray; в качестве последней строки в функции. Затем удалите все остальные строки с помощью return new array;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...