根据所选日期获取日期范围字符串

Getting a day range string based on day selected

假设我有一个用户可以 select 的天数列表(他们可以 select 多个)。

周日、周一、周二、周三、周四、周五、周六。每个都有一个与之关联的数字(0-6)。 0 是星期日,6 是星期六:

vm.weekDays = [
        {name: 'Sunday', number: 0},
        {name: 'Monday', number: 1},
        {name: 'Tuesday', number: 2},
        {name: 'Wednesday', number: 3},
        {name: 'Thursday', number: 4},
        {name: 'Friday', number: 5},
        {name: 'Saturday', number: 6},
    ]

假设用户select在周日、周一、周二,我们应该得到字符串"Sunday - Tuesday"。但是,如果用户 select 是星期日、星期一、星期二、星期四,我们应该得到字符串 "Sunday - Tuesday, Thursday"。如果用户 select 是星期天、星期二、星期四,那么他们应该会看到。

目前,我正在将字符串存储在一个数组中。然后,我将使用它来显示字符串。

这是我目前的情况:

function test() {

        vm.display = [];

        var test = _.sortBy(vm.sWeekDays, 'number');

        var start = 0;
        var end = 0;
        if(test.length > 1){
            for(var i=0; i <= test.length-2; i++){
                if(test[i].number+1 != test[i+1].number) {
                    start = i + 1;
                    end = i;
                    vm.display.push(test[i].name);
                }
                end = i+1;
            }
            vm.display.push(test[start].name + " - " + test[end].name);
        } else {
            vm.display.push(test[0].name);
        }
    }

目前,我连续几天显示,但如果我从星期日到星期二和星期四select,它就无法正确显示。

非常感谢任何帮助。

我稍微编辑了你的代码,但我希望答案很清楚。这是我的实现

 var vm = {};
 vm.weekDays = [{
     name: 'Sunday',
     number: 0
 }, {
     name: 'Monday',
     number: 1
 }, {
     name: 'Tuesday',
     number: 2
 }, {
     name: 'Wednesday',
     number: 3
 }, {
     name: 'Thursday',
     number: 4
 }, {
     name: 'Friday',
     number: 5
 }, {
     name: 'Saturday',
     number: 6
 }, ]

 function formatSelected(selected) {
     vm.display = [];
     selected = _.sortBy(selected, 'number'); //this could be vm.selected instead of passing it as a parameter

     var lastnumber = 0,
         template = {
             name: '',
             number: 0
         },
         last,
         list = [];

     if (selected.length > 0) {
        last = selected[0];
        for (var i = 0; i < selected.length; i++) {
            if (last) {
                var left = selected[i - 1] ? selected[i - 1] : angular.copy(template);
                console.log(selected[i].number - left.number)

                if (i > 0 && selected[i].number - left.number > 1) {
                    list.push(((left.name != last.name) ? (last.name + '-') : '') + left.name);
                    last = selected[i];
                }
                if((i == (selected.length - 1))) {
                    list.push(((selected[i].name != last.name) ? (last.name + '-') : '') + selected[i].name);
                }
            } else {
                last = selected[i];
            }
        }
    }

     vm.display = list;
 };

然后你可以用数组调用函数

 formatSelected([{
     name: 'Sunday',
     number: 0
 }, {
     name: 'Monday',
     number: 1
 }, {
     name: 'Tuesday',
     number: 2
 }, {
     name: 'Wednesday',
     number: 3
 }, {
     name: 'Saturday',
     number: 6
 }, ]);

我编辑了处理数组的解决方案,例如:

formatSelected([{ name: 'Sunday', number: 0}, { name: 'Tuesday', number: 2}, { name: 'Thursday', number: 4}]);

我们可以有一个映射来存储范围,然后我们将映射分解为结果字符串。

// The map structure 
[
    [{
        name: 'Sun',
        number: 0
    }, {
        name: 'Mon',
        number: 1
    }, {
        name: 'Tue',
        number: 2
    }],
    [{
        name: 'Thu',
        number: 4
    }]
]

在此之后,我们检查每个范围是否需要转换为 'day1 - day3''day1, day2'

请检查这个JSFiddle