Javascript天输出到范围格式?

时间:2017-07-17 18:37:29

标签: javascript date

我有一个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

问题: 是否有任何日期函数我应该知道这样的句柄范围还是需要自定义?

不确定是否存在我可以说的任何事情"这些日子以范围式格式向我展示"。

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

注意:连续几天也会用连字符显示,即使逗号会这样做。如果您喜欢这种情况下的逗号,请将第一个正则表达式中的*替换为+