Можно ли заменить оператор аргументом в функции? Если да, то как?
function math(x, y) {
for (let i = x; i < y; i++) {
...
}
}
Мне нужно использовать цикл не только со знаком меньше и инкрементом, но и со знаком больше и декрементом. Можно ли знак меньше и инкремент заменить принимаемыми функцией аргументами? Или что можно сделать, чтобы не переписывать постоянно один и тот же цикл?
Ответы (3 шт):
function math(x, y) {
let start = Math.min(x, y);
let end = Math.max(x, y);
for (let i = start, i < end; i++) {
...
}
}
Если нет вероятности пролететь условие 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));
Как вариант можно просто проверять в какую сторону цикл
function math(x, y, inc /*boolean*/ ) {
for (let i = x; inc ? i < y : i > y; i += inc ? 1 : -1 ) {
...
}
}