-1

如果这个问题是重复的,我很抱歉,但我真的不知道如何搜索它。对于专业的 JavaScript 程序员来说,这个问题可能听起来“奇怪”,但我不是。

我基本上是在尝试“单行返回”,而不会浪费另一行代码。我知道这不好,以下不是生产代码:

var _ = require('underscore');

module.exports = function (digits) {
    if (!/^\d+$/.test(digits)) return undefined;

    var precomp = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9];

    var sum = _.reduce(digits.toString(), function (mem, dgt, idx) {
        return mem + (idx % 2 == 0 ? parseInt(dgt) : precomp[dgt]);
    }, 0);

    return (var mod = sum % 10 == 0) ? 0 : 10 - mod; // Error
};

最后一行抛出一个错误,因为var关键字。我记得有时在 PHP 中做同样的事情。

编辑:我认为在回答之前阅读问题并不那么“难”......我在问它是否可能,我并不是说它是正确的,好看的,或​​者其他什么。

(顺便说一下,这是 luhn 检查计算)

4

6 回答 6

10

VariableDeclaration 不是表达式。之前声明一下就行了。

module.exports = function (digits) {
    var mod;

    // ...

    return (mod = sum % 10 ...
}
于 2013-05-24T19:02:37.950 回答
3

我认为你这样做的唯一方法是:

var mod = sum % 10;
return (mod == 0) ? 0 : 10 - mod;

谁在乎多出一行代码?为什么这很重要?

于 2013-05-24T19:02:39.970 回答
3

我觉得你在这里太努力了。只需var mod在 return 语句之前移动。你不会因为这里多了一行代码而被软件之神击毙。清晰胜于简洁。

于 2013-05-24T19:03:27.377 回答
3

JavaScript 不是 PHP

var mod = sum % 10;
return (mod === 0) ? 0 : 10 - mod;
于 2013-05-24T19:06:50.607 回答
2

我看你不喜欢到目前为止的任何答案。避免首先声明变量的一种方法是这样,您可能也不喜欢:

return (sum % 10 == 0) ? 0 : 10 - (sum % 10);

这不需要额外的行,但确实需要额外的 mod。


另一个可能使代码极度混乱的选项是向函数添加一个虚拟参数:

module.exports = function (digits, mod) {
    /* code */
    return (mod = sum % 10) == 0 ? 0 : 10 - mod; // Error
};
于 2013-05-24T19:09:15.017 回答
1

由于您不sum用于任何其他目的,您可以将%操作员向上移动,执行以下操作:

var _ = require('underscore');

module.exports = function (digits) {
    if (!/^\d+$/.test(digits)) return undefined;

    var precomp = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9];

    var sum = _.reduce(digits.toString(), function (mem, dgt, idx) {
        return mem + (idx % 2 == 0 ? parseInt(dgt) : precomp[dgt]);
    }, 0) % 10;

    return (sum == 0) ? 0 : 10 - sum; // Error
};
于 2013-05-24T19:19:00.833 回答