for循环变量表达式数学操作

时间:2014-05-16 13:54:55

标签: javascript math for-loop language-agnostic

我正在用JS编写程序,我觉得我在重复代码,这不好。我正在尝试避免使用具有两个类似if then else的{​​{1}}块,并仅使用一个for loop重新编写if then else

请注意:for loop的值为minimum0的值为maximum。如果10小于new_value,我想执行从old_value minimum的for循环,否则我想从{{1}执行它} DOWNto new_value

让我们看看它的实际效果,让我们说javascript(语言不可知的答案是受欢迎的和赞成的 - 但不会给你一个额外的cookie)

maximum

我有一种感觉,这两个new_value相似,足以在数学方法中写成一个。尝试使用绝对值var minimum = 0; var maximum = 10; var old_value = 5; /* var new_value = taken from user input whatever ... */ if(new_value<old_value) { for(i=minimum;i<new_value;i++) { // whatever } } else { for(i=maximum;i>new_value;i--) { // whatever } } for loop,但没有运气。

我不想使用Math.abs()设置其他帮助变量来提供适当的值。

那么,问题是什么:我想知道这是否可以在一个Math.max.apply()中重写,而不是嵌套在if then else中。

使用内置js函数的完整解决方案授予您额外的Cookie。

4 个答案:

答案 0 :(得分:0)

编辑:没有看到关于不使用if / else和变量的原始内容。为什么不做这样的事呢?只需从0到10,使用该值或10减去该值,具体取决于条件。

for(var j = 0; j <= 10; j++) {
    var i = new_value < old_value ? j : 10 - j;

    // whatever
}

将min,max和increment分配为变量,根据if条件定义它们,然后在for循环中使用它们:

var old_value = 5, start, end, inc;

if(new_value<old_value) {
    start = 0;
    end = 10;
    inc = 1;
} else {
    start = 10;
    end = 0;
    inc = -1;
}

for( i = start;i >= start && i <= end; i += inc) {
    // whatever
}

答案 1 :(得分:0)

你可以滥用三元运算符只是为了好玩:

var minimum = 0;
var maximum = 10;
var old_value = 5;
var new_value = 7;
/* var new_value = taken from user input whatever ... */

var check =(new_value<old_value);
var foo1 = function () { console.log("foo1")  }
var foo2 = function () { console.log("foo2")  }


for(i=check?minimum:maximum;
        check?(i<new_value):(i>new_value);
        check?i++:i--)
{
    check?foo1():foo2();
}

答案 2 :(得分:0)

第二个循环是否有反向迭代?如果没有,你可以简单地使用

var i0 = new_value<old_value ? minimum : new_value+1;
var i1 = new_value<old_value ? new_value : maximum+1;

for(i=i0;i<i1;++i)
{
    //whatever
}

修改:根据您的评论,如果您确定要处理的是整数,则可以使用

var i0 = new_value<old_value ? minimum : maximum;
var d  = new_value<old_value ? 1 : -1;

for(i=i0;i!=new_value;i+=d)
{
    //whatever
}

如果不是

var i0 = new_value<old_value ? minimum : maximum;
var d  = new_value<old_value ? 1 : -1;

for(i=i0;d*i<d*new_value;i+=d)
{
    //whatever
}

答案 3 :(得分:0)

我做到了!

使用此+(old_value>new_value)而不是true/false我得到1/0。我使用10作为乘数来模拟if then else功能。

让我们假设

var minimum = 0;
var maximum = 10;
var old_value = 5;

有(表达式1;表达式2;表达式3)

表达式1:

如果新值大于旧值,那么我们需要最小值 如果新值小于旧值,那么我们需要最大值

根据上述条件,(maximum*(+(old_value>new_value)))

,我乘以最大值为零

根据(minimum*(+(old_value<new_value))

的上述条件,我将最小值乘以零

通过添加这两个,总和是我应该得到的! (maximum*(+(old_value>new_value)))+(minimum*(+(old_value<new_value)))

如果minimum new_value > old valuemaximum new_value < old_value,则会i!=new_value;

表达式2:

(+(old_value<new_value)+1)+(-1*(+(old_value>new_value)+1))简单。 (我们必须确保最大值大于new_value,最小值小于new_value或者我们有无限循环。)

表达式3:

如果新值大于旧值,那么我们需要i = i +1

如果新值小于旧值,那么我们需要i = i -1

i=i+(+(old_value<new_value)+1)+(-1*(+(old_value>new_value)+1))

会给出2 + -1 = 1 或1 +( - 2)= -1 ,所以我们只需在expression3中使用它

var minimum = 0; var maximum = 10; var old_value = 5; var new_value = 3; // change this value // if new value is bigger than old value then for loop from maximum downto new_value (dont include new value) // if new value is smaller than old value then for loop from minimum upto new_value (dont include new value) for(i=(maximum*(+(old_value>new_value)))+(minimum*(+(old_value<new_value)));i!=new_value;i=i+(+(old_value<new_value)+1)+(-1*(+(old_value>new_value)+1)) ) { alert("Iteration:"+i); }

完整代码:

http://jsfiddle.net/eBLat/

for

另一个问题是,如果这实际上比仅仅在if then else中写两个+true更好...无论如何我很开心。我得到了饼干:D:D

希望有人会在某种程度上发现1在javascript中+false0提供{{1}}这一事实