如何在没有一堆if else语句的情况下编写此函数?

时间:2018-09-06 06:55:42

标签: javascript

我基本上只是想不通,也不想破解它。

如果我一年中这样做52周,它将看起来非常混乱。

有什么提示吗?

更新

这个问题与获取本年度的当前周无关。

这个问题是关于自定义日期以来已经过去了几周。

我希望下周的锻炼显示在本周的第6天;)

示例

我从开始的那一天是99:2018-05-30 18:39:29。

您的某些示例在第15周显示给我。

但是我的代码显示了第16周,这是正确的。看到警告吗?

  calculateUsersCurrentWorkoutWeek: function(timestamp) {
            let daysSinceSignup = moment().diff(timestamp, "days");
            if (daysSinceSignup <= 6) {
              return 1;
            } else if (daysSinceSignup > 6 && daysSinceSignup <= 13) {
              return 2;
            } else if (daysSinceSignup > 13 && daysSinceSignup <= 20) {
              return 3;
            } else if (daysSinceSignup > 20 && daysSinceSignup <= 27) {
              return 4;
            } else if (daysSinceSignup > 27 && daysSinceSignup <= 34) {
              return 5;
            } else if (daysSinceSignup > 34 && daysSinceSignup <= 41) {
              return 6;
            } else if (daysSinceSignup > 41 && daysSinceSignup <= 48) {
              return 7;
            } else if (daysSinceSignup > 48 && daysSinceSignup <= 55) {
              return 8;
            } else if (daysSinceSignup > 55 && daysSinceSignup <= 62) {
              return 9;
            } else if (daysSinceSignup > 55 && daysSinceSignup <= 62) {
              return 10;
            } else if (daysSinceSignup > 62 && daysSinceSignup <= 69) {
              return 11;
            } else if (daysSinceSignup > 69 && daysSinceSignup <= 76) {
              return 12;
            } else if (daysSinceSignup > 76 && daysSinceSignup <= 83) {
              return 13;
            } else if (daysSinceSignup > 83 && daysSinceSignup <= 90) {
              return 14;
            } else if (daysSinceSignup > 90 && daysSinceSignup <= 97) {
              return 15;
            } else {
              return 16;
            }
          }

5 个答案:

答案 0 :(得分:11)

被7除以ceil?

const daysSinceSignup = moment().diff(timestamp, "days");
return Math.ceil(daysSinceSignup / 7);

您今天早上错过咖啡了吗? ;-)


注意:上面的函数将告诉您“自timestamp起的星期数”,这是我从您的文本中了解到的信息,但是您的代码示例并未反映出来。

要获得与代码示例相同的结果,您需要.floor()并加1而不是.ceil()

const daysSinceSignup = moment().diff(timestamp, "days");
return Math.floor(daysSinceSignup / 7) + 1;

答案 1 :(得分:2)

如@Michel所说,除以7并减去1 +

calculateUsersCurrentWorkoutWeek: function(timestamp) {
    let daysSinceSignup = moment().diff(timestamp, "days");
    return Math.floor(daysSinceSignup / 7) + 1;
}

答案 2 :(得分:2)

最简单的方法也可以是按升序创建一个整数数组,以使这些值包含比较的上限。然后,对于daysSinceSignup的每个值,您可以找到索引并向其中添加1,因为您需要返回值为123,。 .. 等等。如果您没有统一的间隔,这将很有用,例如当前间隔始终为7,因此divisionceil的方法也可以使用,但是如果间隔不是统一的,则此方法可能真的有用。

var indexArray = [6,13,20,27,34,41,48,55,62,69,76,83,90,97];
function calculateUsersCurrentWorkoutWeek() {
  let daysSinceSignup = 14;
  var elemIndex = indexArray.findIndex((item)=> item > daysSinceSignup);
  return elemIndex+1;
}
console.log(calculateUsersCurrentWorkoutWeek());

答案 3 :(得分:2)

您正在寻找的是

return Math.ceil((daysSinceStartup + 1) / 7);

对于-1到62之间的任何实数,这将产生与您的代码相同的结果(因为大约62,您忘记替换复制的范围)。就像原始代码一样,它将返回1表示6天,返回2表示6.01天。

答案 4 :(得分:0)

您可以将数据放入array中并使用array.find:

var datas = [
    { min: -Infinity, max: 6, ret: 1 },
    { min: 6, max: 13, ret: 2 },
    { min: 13, max: 20, ret: 3 },
    { min: 20, max: 27, ret: 4 }
];

function calculateUsersCurrentWorkoutWeek(daysSinceSignup) {
    return datas.find(({min, max}) => 
        daysSinceSignup > min && daysSinceSignup <= max
    ).ret;
}

console.log(calculateUsersCurrentWorkoutWeek(5));
console.log(calculateUsersCurrentWorkoutWeek(7));
console.log(calculateUsersCurrentWorkoutWeek(14));