Javascript天输出到范围格式?

SBB*_*SBB 2 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
/*
Run Code Online (Sandbox Code Playgroud)

这是上面代码的小提琴:https://jsfiddle.net/ghs3Lthj/1

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

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

tri*_*cot 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 }
];
Run Code Online (Sandbox Code Playgroud)

然后,我将创建一个包含所有选定日期的简单逗号分隔字符串,然后使用字符串替换来获得所需的格式:

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));
Run Code Online (Sandbox Code Playgroud)

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