我有一个使用javascript的月份列表。我想根据当前日期按时间顺序对其进行排序。
示例
monthsArr = ["March", "February", "November", "December", "January"]
如果当前月份为11月,则排序后的数组应为["Nov", "Dec", "Jan", "Feb", "Mar"]
如果当前月份为1月,则排序后的数组应为["Jan", "Feb", "Mar", "Nov", "Dec"]
不用担心转换为枚举或键值对。可以处理。我正在寻找的是有关如何实现此排序功能的逻辑。
答案 0 :(得分:2)
像这样:
var months =
{
January: 0,
February: 1,
March: 2,
April: 3,
May: 4,
// et&c
November: 10,
December: 11
};
var monthsArr = ["March", "February", "November", "December", "January"];
var month = new Date().getMonth();
monthsArr.sort(function(m1, m2)
{
var n1 = months[m1], n2 = months[m2];
if (n1 < month)
{
n1 = n1 + 12;
}
if (n2 < month)
{
n2 = n2 + 12;
}
return n1 - n2;
});
console.log(monthsArr);
具有名称和月份编号的映射,例如
var months =
{
January: 0,
February: 1,
March: 2,
April: 3,
May: 4,
// et&c
November: 10,
December: 11
};
获取当前月份
var month = new Date().getMonth();
对数组进行排序,比month
早12个月。将它们放在与本月或更晚的月份相同的月份之后。
monthsArr.sort(function(m1, m2)
{
var n1 = months[m1], n2 = months[m2];
if (n1 < month)
{
n1 = n1 + 12;
}
if (n2 < month)
{
n2 = n2 + 12;
}
return n1 - n2;
});
答案 1 :(得分:1)
我建议您获取当月的索引,
然后使用数组切片从该索引开始重新组成数组:
var m = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
var cur = new Date().getMonth()
var sorted = [...m.slice(cur), ...m.slice(0,cur)]
console.log(sorted)
答案 2 :(得分:1)
您可以使用一个对象作为月份值,并以想要的月份为第一个月,然后通过检查实际月份是否小于第一个月或月份值来进行排序。
function sort(array, first) {
var months = { January: 1, February: 2, March: 3, April: 4, May: 5, June: 6, July: 7, August: 8, September: 9, October: 10, November: 11, December: 12 };
return array.sort((a, b) =>
(months[a] < months[first]) - (months[b] < months[first]) ||
months[a] - months[b]
);
}
console.log(...sort( ["March", "February", "November", "December", "January"], "November"));
console.log(...sort( ["March", "February", "November", "December", "January"], "January"));