这是最好的表达条件吗?

时间:2011-10-18 13:14:27

标签: javascript

我正在努力从函数中获取最终值,我有两个可点击的按钮,一个是前一个,另一个是下一个。点击这两个,我得到幻灯片计数。得到这个结果我使用以下代码。它工作得更好,但直到我发现它,可能有一个单行解决方案..

任何人都可以更正此代码以最小化吗?

var tdLength = 7;
    var num = 0;
    $('a.buttons').click(function(){
        num = ($(this).attr('id') == "next-arrow") ? num +=1 : num -=1;
        num = ( num > tdLength) ? 1 : num;
        num = (num < 1) ? tdLength : num;
        alert(num);
    })

提前感谢..

2 个答案:

答案 0 :(得分:3)

我的镜头:

var num = 0;
function add(amount) {
    num = (num + tdLength - 1 + amount) % tdLength + 1
    alert(num);
}

$('#next-arrow').click(function(){add(1)});
$('#prev-arrow').click(function(){add(-1)});

邪恶的人:

num = (num + tdLength - 1 + amount) % tdLength + 1

对于合理的[1..tdLength]值,始终以amount(包括)生成值。由@Jon回答。

答案 1 :(得分:2)

一个想法是你可以替换这个

num = (num > tdLength) ? 1 : num;
num = (num < 1) ? tdLength : num;

使用下面的行,也可以保证在时间间隔[0 .. (tdLength-1)]中提供结果:

num = (num + tdLength) % tdLength;

这里的区别在于您的代码使用基于1的索引,而%导致基于0的索引。

您还可以缩短第一行:

num = ($(this).attr('id') == "next-arrow") ? num +=1 : num -=1;

由于您已掌控,请在链接中添加data-skip(或类似)属性(例如<a id="prev-arrow" data-skip="-1">...</a>),这样您就可以执行此操作:

num += parseInt($(this).data('skip'));

所以这一切都给出了:

var tdLength = 7;
var num = 0; // "first" is preselected
$('a.buttons').click(function(){
    num = (num + parseInt($(this).data('skip')) + tdLength) % tdLength;
    alert(num);
})