【问题标题】:Getting a day range string based on day selected根据所选日期获取日期范围字符串
【发布时间】:2016-10-27 09:46:03
【问题描述】:

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

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

假设用户选择星期日、星期一、星期二,我们应该得到字符串“Sunday - Tuesday”。但是,如果用户选择星期日、星期一、星期二、星期四,我们应该得到字符串“星期日 - 星期二,星期四”。如果用户选择周日、周二、周四,那么他们应该会看到准确的结果。

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

这是我目前所拥有的:

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

目前,我可以连续显示几天,但如果我选择从周日到周二和周四,则无法正确显示。

非常感谢任何帮助。

【问题讨论】:

    标签: javascript angularjs string for-loop weekday


    【解决方案1】:

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

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

    【讨论】:

    • 输入为[{ name: 'Sunday', number: 0}, { name: 'Tuesday', number: 2}, { name: 'Thursday', number: 4}]时,不连续三天,结果不正确...
    • 感谢您的帮助,我尝试了您的方法并且成功了。
    • 很高兴能为您提供帮助。快乐编码:)
    【解决方案2】:

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

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

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

    请查看JSFiddle

    【讨论】:

    • 在接下来的日子里,我会尝试你完成任务的方式并更新你。
    猜你喜欢
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多