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

时间:2016-06-24 17:29:23

标签: javascript angularjs string for-loop weekday

假设我有一个用户可以选择的日期列表(他们可以选择多个)。

周日,周一,周二,周三,周四,周五,周六。每个都有一个与之相关的数字(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},
    ]

假设用户选择星期日,星期一,星期二,我们应该得到字符串"星期日 - 星期二"。但是,如果用户选择星期日,星期一,星期二,星期四,我们应该得到字符串"星期日 - 星期二,星期四和#34;。如果用户选择星期日,星期二,星期四,那么他们应该看到这一点。

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

这是我到目前为止所拥有的:

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);
        }
    }

目前,我连续几天出现,但如果我从周日到周二和周四选择它没有正确显示。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我编辑了你的代码,但我希望答案很明确。这是我的实施

 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}]);

答案 1 :(得分:0)

我们可以有一个地图来存储范围,然后我们将地图缩减为结果字符串。

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

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

请检查此JSFiddle

相关问题