Метод Splice не удаляет элементы из массива

#javascript #arrays #splice

#javascript #массивы #сращивание

Вопрос:

Я пытаюсь реализовать функцию, которая принимает три аргумента (min, max, step) и генерирует диапазон целых чисел от min до max с шагом. Первое целое число — это минимальное значение, второе — максимальное значение диапазона, а третье — шаг.

Вот пример того, как это должно выглядеть: generateRange(2, 10, 2) должен возвращать массив [2,4,6,8,10] .

Я использую метод splice для удаления любых существующих элементов в массиве, которые больше аргумента max.

 function generateRange(min, max, step) {
  var arr = [];
  var count = min;
  for (var i = 0; i < max / step; i  ) {
    arr[i] = count;
    count = count   step;
    arr[i] > max ? arr.splice(i, 1) : arr[i];
  }
  return arr;
}

console.log(generateRange(2, 10, 2));  

Всякий раз, когда я console.log получаю свой результат, я получаю кучу запятых после последнего item…so это выглядит примерно так: [2,4,6,8,10, , , , ]

Похоже, что он не удаляет элементы. Чего мне не хватает? Спасибо!

Комментарии:

1. все работает нормально, когда я запускаю код: [2, 4, 6, 8, 10]

2. Почему бы вам просто не увеличивать до (max — max%step) / step вместо того, чтобы делать эту ерунду сращивания

3. Для меня это выглядит нормально.

4. Почему вы используете троичный оператор, когда значение выражения не используется? Просто используйте if оператор.

5. Ваш массив начинается с пустого. Нет существующих элементов для удаления.

Ответ №1:

Тернарный оператор немного странный, поскольку выражение не сохраняется. Он исправляет массив, удаляя слишком большие значения. Это работает один раз, но если будет второй раз, я увеличу, и при присвоении arr[i] длина массива снова будет такой, как если бы раньше не splice выполнялось (за исключением неопределенного значения в этом индексе i-1).

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

Поэтому сделайте count переменную своей переменной цикла и условием:

 function generateRange(min, max, step){
    var arr = [];
    for(var count = min; count <= max; count =step){
        arr.push(count);
    }
    return arr;
}

var res = generateRange(2, 10, 2);

console.log(res);  

Менее читаемая, но более короткая версия ES6 будет:

 function generateRange(min, max, step){
    return Array.from(Array(Math.floor((max-min)/step) 1), (x,i) => min i*step);
}

let res = generateRange(2, 10, 2);

console.log(res);