Javascript循环并组合对象

时间:2017-05-21 03:14:29

标签: javascript function date

我需要帮助处理可能是常见问题的事情,以及其他人也可以从中受益的事情,即修改对象中的日期并将它们组合成按时间顺序排列的列表。总体目标是创建一个列表,反映一年中即将到来的所有特殊日期:

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;
&#13;
&#13;

2 个答案:

答案 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),因此对于格林威治以西的主机,日期可能会显示为前一天。