我需要帮助处理可能是常见问题的事情,以及其他人也可以从中受益的事情,即修改对象中的日期并将它们组合成按时间顺序排列的列表。总体目标是创建一个列表,反映一年中即将到来的所有特殊日期:
1 Jan - Sharpe's Anniversary 2 May - Edward's Birthday 12 Dec - Zero's Anniversary etc...
我开始创建一个对象来表示这个。然后切出年份,以便比较不会按照他们最初发生的顺序排列,但会给出年度基础。然后执行比较以按时间顺序排列日期。然后使用匹配的人员身份注销结果。
到目前为止,我得到了它的工作。但是,我不知道如何重复这个并让它干涸。当然,为周年纪念日运行,然后在没有制作某种自定义功能的生日时,这样做会很草率。我所有的尝试都没有成功结束。
有没有人有更优雅的解决方案?
非常感谢社区:)
// Sample data
var items = [{
name: 'Edward',
anniversary: "2015-01-23",
birthday: "1988-05-02"
},
{
name: 'Sharpe',
anniversary: "2017-01-01",
birthday: "1988-05-10"
},
{
name: 'And',
anniversary: "2018-05-10",
birthday: "1988-06-12"
},
{
name: 'The',
anniversary: "1988-08-11",
birthday: "1979-03-12"
},
{
name: 'Magnetic',
anniversary: "2017-01-05",
birthday: "1956-06-21"
},
{
name: 'Zeros',
anniversary: "1990-12-12",
birthday: "1935-07-23"
}
];
// Slice out the year so that dates are annualized
for (var i = 0; i < items.length; i++) {
items[i].anniversary = items[i].anniversary.slice(5, 10);
};
// Sort dates in chronological order
items.sort(function(a, b) {
return new Date(a.anniversary) - new Date(b.anniversary);
});
// Console.log the dates with their associated name
for (var i = 0; i < items.length; i++) {
console.log(items[i].anniversary + " " + items[i].name);
}
&#13;
答案 0 :(得分:0)
let goal = items
.map( ({ name, anniversary }) => ({ name, 'anniversary': anniversary.slice( 5, 10 ) }) )
.sort( ({ 'anniversary': a }, { 'anniversary': b }) => {
if( a > b ) return 1;
if( a < b ) return -1;
return 0;
}
.map( ({ name, anniversary }) => anniversary + ' ' + name );
goal.forEach( item => { console.log( item ); });
答案 1 :(得分:0)
当您从“1988-08-11”之类的日期中删除年份时,您将获得“08-11”。如果您随后使用内置的Date解析器对其进行解析,那么当原始日期为8月11日时,您将获得无效的日期或11月1日的日期。解析器将看到一年零一个月,并在缺失的一天使用1。
但不要绝望! ISO 8601日期格式可以按字符串排序,因此可以按原样排序,而不是日期,例如。
// Sample data
var items = [{
name: 'Edward',
anniversary: "2015-01-23",
birthday: "1988-05-02"
},
{
name: 'Sharpe',
anniversary: "2017-01-01",
birthday: "1988-05-10"
},
{
name: 'And',
anniversary: "2018-05-10",
birthday: "1988-06-12"
},
{
name: 'The',
anniversary: "1988-08-11",
birthday: "1979-03-12"
},
{
name: 'Magnetic',
anniversary: "2017-01-05",
birthday: "1956-06-21"
},
{
name: 'Zeros',
anniversary: "1990-12-12",
birthday: "1935-07-23"
}
];
// Get the events
var specialDates = items.reduce(function(acc, item) {
acc.push([item.name, item.anniversary.substr(5), 'Anniversary'], [item.name, item.birthday.substr(5), 'Birthday']);
return acc;
}, []).sort(function (a, b) { // sort on month
return a[1].localeCompare(b[1]);
}).map(function(event) { // Replace month number with short name
var months = [,'Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec'];
return [event[0], months[+event[1].split('-')[0]] + ' ' + event[1].substr(3), event[2]];
});
// Write result
specialDates.forEach(function(event) {
console.log(event[1] + ': ' + event[0] + ' ' + event[2]);
});
这可能会更聪明,并从原始对象获取事件名称,以便您可以根据需要添加任意数量的事件类型,而不是硬编码,所以像这样的对象:
var items = [{
name: 'Edward',
events: {
anniversary: "2015-01-23",
birthday: "1988-05-02"
}
},
...
另请注意,new Date("2015-01-23")
会将字符串视为UTC(时区偏移+00:00),因此对于格林威治以西的主机,日期可能会显示为前一天。