圆数回到3的倍数

时间:2015-10-26 16:51:26

标签: javascript switch-statement

我处于需要执行以下操作的情况:

if n = 0 or 1 or 2; return 0;
if n = 3 or 4 or 5; return 3;
if n = 6 or 7 or 8; return 6;
if n >= 9; return 9

我有以下代码正常工作

var adjustNumberOfProducts = function(number) {
    var output = 0;
    switch(number) {
        case 0:
        case 1:
        case 2:
            output = 0;
            break;
        case 3:
        case 4:
        case 5:
            output = 3;
            break;
        case 6:
        case 7:
        case 8:
            output = 6;
            break;
        default:
            output = 9
            break;
    }
    return output;
}

我想知道是否有更优化(更快的执行)方式。

4 个答案:

答案 0 :(得分:4)

如果你想要原始速度,那么某种查找可能你想要的东西;但是,通常的规则适用:使用分析器。

想到的查找就像是错误的:

// DOES NOT WORK: 0 is falsy in JavaScript
var adjustNumberOfProducts = function (number) {
    return [0, 0, 0, 3, 3, 3, 6, 6, 6][number] || 9
}

但由于0在JavaScript中是假的,我们可以使用T. J. Crowder(有趣,不完全严重)"调整":

var adjustNumberOfProducts = function (number) {
    return ([1, 1, 1, 4, 4, 4, 7, 7, 7][number] || 10) - 1
}

存在巨大的可读性损失,许多程序员在实际代码中看到这一点时会非常畏缩(我认为"我的眼睛!"可能是现代反应。)

我认为需要使用jsperf测试来使用switch语句和Math.min(number - (number% 3),9)技术映射这种恶意方法。我会使用一些asm.js技术,比如使用零按位来强制整数数学,看看是否有帮助(尽管可能没有)。

答案 1 :(得分:2)

当然,你可以这样做:

var adjustNumberOfProducts = function(number) {

    return Math.min(number - (number% 3),9);
}

你将除法除数的数字减去3,强制它是3的倍数,然后取9之间的最小值作为更高的值

答案 2 :(得分:1)

您可以使用一些简单的数学来获得此输出:

function adjust( number ) {
    return Math.min(Math.floor(number / 3) * 3, 9);
}

for ( var i = 0; i < 10; i++ )
  document.write('For '+ i +': '+ adjust(i) + '<br>');

编辑:处理最大案例9。

编辑:关于速度的说明。

虽然上面的代码每次调用adjust时都会应用更多操作,但它的执行路径更少。 switch语句有9种不同的执行路径供编译器考虑,而单个数学流可以编译为更快的本机代码(使用JIT编译器)

答案 3 :(得分:0)

只需使用i < 9 ? i - i % 3 : 9即可获得您的价值。

var i;
for (i = 0; i < 16; i++) {
    document.write(i + ' ' + (i < 9 ? i - i % 3 : 9) + '<br>');
}