根据所选日期获取日期范围字符串
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
假设我有一个用户可以 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