Можно ли заменить оператор аргументом в функции? Если да, то как?

function math(x, y) {
    for (let i = x; i < y; i++) {
        ...
    }
}

Мне нужно использовать цикл не только со знаком меньше и инкрементом, но и со знаком больше и декрементом. Можно ли знак меньше и инкремент заменить принимаемыми функцией аргументами? Или что можно сделать, чтобы не переписывать постоянно один и тот же цикл?


Ответы (3 шт):

Автор решения: Igor
function math(x, y) {
  let start = Math.min(x, y);
  let end = Math.max(x, y);
  for (let i = start, i < end; i++) {
    ...
  }
}
→ Ссылка
Автор решения: Leonid

Если нет вероятности пролететь условие i != y, то можно просто передать 1/-1 в качестве слагаемого для i. Потому как условие > или < подразумевает !=плюс некоторую страховку пролететь момент если сравниваются дробные числа или инкремент/декремент - дробное или больше единицы. Если прибавляется или убавляется всегда единица, начальное значение i (значение x) - целое и y (операнд сравнения с i) - целое, то выражения равнозначны.

function math1(x, y) {
    let arr = [];
    for (let i = x; i < y; i++) {
        arr.push(i);
    }
    return arr;
}

function math2(x,y) {
    let arr = [];
    for (let i = x; i > y; i--){
        arr.push(i);
    }
    return arr;
}

function math(x,y,sign = 1){ // sign 1 (by default) -> "less than" and i++ or -1 -> "bigger than" and i--
    let arr = [];
    for(let i = x; i != y; i+= sign){
        arr.push(i);
    }
    return arr;
}

console.log(math1(0,5));
console.log(math2(5,0));

console.log(math(0,5));
console.log(math(5,0,-1));

Если доработать ответ Igor, то функция будет работать как надо и при условии использования дробных чисел. То есть, количество шагов определяется переменной j, а i хранит правильную последовательность индексов (если это нужно для полного соответствия исходной функции).

function math(x,y,sign = 1){ // sign 1 (by default) -> "less than" and i++ or -1 -> "bigger than" and i--
    let start = Math.min(x,y);
    let end = Math.max(x,y);
    
    let arr = [];
    for(let i = x, j = start; j < end; i += sign, j += Math.abs(sign)){
        arr.push(i);
    }
    return arr;
}

console.log(math(0,5));
console.log(math(5,0,-1));

console.log(math(0.5,5,0.5));
console.log(math(7.2,2,-1));

→ Ссылка
Автор решения: Pavel Grishaev

Как вариант можно просто проверять в какую сторону цикл

function math(x, y, inc /*boolean*/ ) {
    for (let i = x; inc ? i < y : i > y; i += inc ? 1 : -1 ) {
        ...
    }
}
→ Ссылка