我有一个javascript对象,其中包含一周的日期和true/false
值(如果已选中)。
然后我将这个对象传递给一个函数,我需要以特定的方式格式化日期并将其返回。
基本上,如果任何日子跟随另一天也是如此,它会将选定的日期显示为M-F
等范围。如果选择的日期为M, T, F
,那么输出将为M-T, F
以下是我尝试如何进行设置的示例:
// Define our selected days
var days = {
sunday: true,
monday: false,
tuesday: false,
wednesday: true,
thursday: true,
friday: false,
saturday: false
};
// Format our dates
function formatDates(days) {
// Logic Here
return days;
}
console.log(formatDates(days));
// Scenarios
/* Input
1: Checked: Su, W, Th
2: Checked: Su, M, T, Sa
3: Checked: M, T, Th, Sa
4: Checked: T, Th, Sa, Sun
/*
/*
Output
1: Su, W, Th
2: Sa - T
3: M - T, Th, Sa
4: Sa - Su, T, Th
/*
以上是代码的小提琴:https://jsfiddle.net/ghs3Lthj/1
问题: 是否有任何日期函数我应该知道这样的句柄范围还是需要自定义?
不确定是否存在我可以说的任何事情"这些日子以范围式格式向我展示"。
答案 0 :(得分:5)
由于对象中的属性没有保证顺序,因此最好使用数组。当订单很重要时,数组是合适的。
此外,您需要定义每天的缩写。
所以我建议这个结构:
var days = [
{ name: "sunday", abbrev: "Su", selected: true },
{ name: "monday", abbrev: "M", selected: false },
{ name: "tuesday", abbrev: "Tu", selected: false },
{ name: "wednesday", abbrev: "W", selected: true },
{ name: "thursday", abbrev: "Th", selected: true },
{ name: "friday", abbrev: "F", selected: false },
{ name: "saturday", abbrev: "Sa", selected: false }
];
然后我会创建一个包含所有选定日期的简单逗号分隔字符串,然后使用字符串替换来获得所需的格式:
function formatDates(days) {
return days.map( day => day.selected ? day.abbrev : "" )
.join(", ")
.replace(/(\w+)(?:, \w+)*, (\w+)/g, "$1 - $2") // insert hyphen were appropriate
.replace(/^(, )+|, (?=,|$)/g, "") // remove commas we don't need
}
var days = [
{ name: "sunday", abbrev: "Su", selected: true },
{ name: "monday", abbrev: "M", selected: false },
{ name: "tuesday", abbrev: "Tu", selected: false },
{ name: "wednesday", abbrev: "W", selected: true },
{ name: "thursday", abbrev: "Th", selected: true },
{ name: "friday", abbrev: "F", selected: false },
{ name: "saturday", abbrev: "Sa", selected: false }
];
console.log(formatDates(days));
注意:连续几天也会用连字符显示,即使逗号会这样做。如果您喜欢这种情况下的逗号,请将第一个正则表达式中的*
替换为+
。