是否可以在不重复上述值的情况下从三元运算中返回比较值+字符串?

ale*_*xan 4 javascript if-statement ternary-operator

我正在尝试找到解决问题的简便方法。

问题:

我想尝试并简化它,但是我不知道从哪里开始。

let days = Math.floor(distance / (1000 * 60 * 60 * 24));
if(days > 0) {
    days = days + "d";
}
Run Code Online (Sandbox Code Playgroud)

尝试:

我当时想我可以使用三元运算符来返回计算+“ d”,如下所示:

let days = Math.floor(distance / (1000 * 60 * 60 * 24)) === 0 ? Math.floor(distance / (1000 * 60 * 60 * 24)) + "d" : "";
Run Code Online (Sandbox Code Playgroud)

但是我认为这很混乱,我无法找到其他方法。

当前结构

我目前正在为这样的计时器计算天,小时,分钟和秒:

let distance = expiry - now;
let days = Math.floor(distance / (1000 * 60 * 60 * 24));
let hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((distance % (1000 * 60)) / 1000);
Run Code Online (Sandbox Code Playgroud)

之后,我只想显示几天(如果是)greater than 0或分钟greater than 0(等等)。我目前正在使用一堆if语句和一个布尔值来检查是否已经找到大于0的值。像这样:

let isSet = false;

if (days > 0 && !isSet) {
    current = days + "d";
    isSet = true;
}

if (hours > 0 && !isSet) {
    current = hours + "h";
    isSet = true;
}

if (minutes > 0 && !isSet) {
    current = minutes + "m";
    isSet = true;
}

if (seconds > 0 && !isSet) {
    current = seconds + "s";
    isSet = true;
}

if (seconds < 0 && !isSet) {
    current = "expired";
    isSet = true;
}
Run Code Online (Sandbox Code Playgroud)

但是,这确实感到非常重复和错误(即使可行)。

amd*_*amd 5

我认为这种模式的最佳解决方案是在数组中定义范围,然后与之进行比较,以避免代码重复。

var ranges = [
    [86400000, 'd'],
    [3600000, 'h'],
    [60000, 'm'],
    [1000, 's'],
]
Run Code Online (Sandbox Code Playgroud)

然后遍历此数组,并检查提供的值是否大于当前时间段。

function humanDiff(milliseconds) {
    for (var i = 0; i < ranges.length; i++) {
        if (milliseconds >= ranges[i][0]) {
            return Math.round((milliseconds / ranges[i][0])) + ranges[i][1]
        };
    }
    return milliseconds;
}
Run Code Online (Sandbox Code Playgroud)

例:

var expiry = new Date('2019-03-26 08:29');
var now = new Date('2019-03-26 05:00');
humanDiff(expiry - now) // 3h
Run Code Online (Sandbox Code Playgroud)

好处:

  • 避免不必要的计算(在适当的日子不要计算小时和分钟)
  • 避免代码重复
  • 将设置与执行分开(添加更多指标就像在ranges数组中添加新记录一样容易)