Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何修正我使用周数构建日历的算法?_Javascript_Angularjs_Algorithm_Momentjs - Fatal编程技术网

Javascript 如何修正我使用周数构建日历的算法?

Javascript 如何修正我使用周数构建日历的算法?,javascript,angularjs,algorithm,momentjs,Javascript,Angularjs,Algorithm,Momentjs,我正在编写一个算法来生成日历中的行。 日历是用AngularJS和JavaScript编写的。我还使用momentJS来帮助您 对于每个月,我都在构建一系列的周。数组中的对象将周数映射到相应的年份。我这样做是为了方便地显示来自服务器的一些数据 e、 g.三月 [ { week: 9, year: 2019 }, { week: 10, year: 2019 }, { week: 11, year: 2019 }, { week: 12, year: 2019 },

我正在编写一个算法来生成日历中的行。 日历是用AngularJS和JavaScript编写的。我还使用momentJS来帮助您

对于每个月,我都在构建一系列的周。数组中的对象将周数映射到相应的年份。我这样做是为了方便地显示来自服务器的一些数据

e、 g.三月

[
    { week: 9, year: 2019 },
    { week: 10, year: 2019 },
    { week: 11, year: 2019 },
    { week: 12, year: 2019 },
    { week: 13, year: 2019 }
]
我的算法在大多数月份运行良好,例如2月->11月 然而,12月和1月似乎是边缘案例

12月的最后一周可以过渡到下一年,1月的第一周可以过渡到上一年。我的算法在边缘情况下失败

代码如下:

例如,它在2018年12月和2017年1月失败

预期成果:

[
    { week: 53, year: 2016 }, 
    { week: 1, year: 2017 }, 
    { week: 2, year: 2017 }, 
    { week: 3, year: 2017 },
    { week: 4, year: 2017 },
    { week: 5, year: 2017 }
]


[
    { week: 51, year: 2018 }, 
    { week: 52, year: 2018 }, 
    { week: 53, year: 2018 }, 
    { week: 54, year: 2018 },
    { week: 1, year: 2019 }
]
实际结果:

2018年12月

[
    { week: 51, year: 2018 }, 
    { week: 52, year: 2018 }, 
    { week: 53, year: 2018 }, 
    { week: 54, year: 2018 },
    { week: 1, year: 2018 }
]
JAN 2017 - completely wrong
0: {week: 1, year: 2017}
1: {week: 2, year: 2017}
2: {week: 3, year: 2017}
3: {week: 4, year: 2017}
4: {week: 5, year: 2017}
如何修正算法以适应边缘情况

以下是我的算法片段:

var data = {};        
data.currentCalendarMonth = moment().startOf('month');

var result = buildListOfWeeksForCurrentMonth();

console.log(result);

function buildListOfWeeksForCurrentMonth() {

  data.weeks = [];

  //this could be in a different year
  var startOfMonthWeekNumber = data.currentCalendarMonth.clone().startOf('month').week();
  var endOfMonthWeekNumber = data.currentCalendarMonth.clone().endOf('month').week();

  console.log(' startOfMonthWeekNumber ', startOfMonthWeekNumber);
  console.log(' endOfMonthWeekNumber ', endOfMonthWeekNumber);

  var weeksHere = [];

  //TODO: end of year edge case
  if (startOfMonthWeekNumber > endOfMonthWeekNumber) {

      console.log(' edge cases for dec and jan ');

      var weeksInYear = moment().weeksInYear();

      console.log(' weeks in year ', weeksInYear);

      for (var k = startOfMonthWeekNumber; k < weeksInYear + 1; k++) {

          console.log(' week year ', data.currentCalendarMonth.clone().week(k).startOf('day').weekYear());

          weeksHere.push({
              week: k,
              year: data.currentCalendarMonth.clone().week(k).startOf('day').weekYear()
          });
      }

      for (var m = 1; m < endOfMonthWeekNumber + 1; m++) {

          console.log(' week year again ', data.currentCalendarMonth.clone().get('year'));

          weeksHere.push({
              week: m,
              year: data.currentCalendarMonth.clone().get('year')
          });
      }

    } else {

        console.log(' ususal case ');

        for (var i = startOfMonthWeekNumber; i < endOfMonthWeekNumber + 1; i++) {
            weeksHere.push({
                week: i,
                year: data.currentCalendarMonth.clone().week(i).startOf('day').weekYear()
            });
        }
    }

    console.log(' WEEKS ', weeksHere);

    return weeksHere;
  }
var data={};
data.currentCalendarMonth=moment().startOf('month');
var result=buildListOfWeeksForCurrentMonth();
控制台日志(结果);
函数buildListOfWeeksForCurrentMonth()的作用{
data.weeks=[];
//这可能是另一年
var startOfMonthWeekNumber=data.currentCalendarMonth.clone().startOf('month').week();
var endOfMonthWeekNumber=data.currentCalendarMonth.clone().endOf('month').week();
console.log('startOfMonthWeekNumber',startOfMonthWeekNumber);
日志('endOfMonthWeekNumber',endOfMonthWeekNumber);
var weeksHere=[];
//待办事项:年底边缘案件
如果(开始月周数>结束月周数){
日志(‘12月和1月的边缘案例’);
var weeksInYear=moment().weeksInYear();
console.log('weeks in year',weeksInYear);
对于(变量k=startOfMonthWeekNumber;k
您能否发布您的实际结果以与预期结果进行比较?获取一年的第一天,如果没有,请返回上一个星期天。然后再加上7天,直到你结束相关的一年。你能发布你的实际结果与预期结果进行比较吗?获得一年的第一天,如果没有,回到上一个星期天。然后再加上7天,直到你度过相关的一年。