【问题标题】:How do I get the latest timestamp for each month in an array如何获取数组中每个月的最新时间戳
【发布时间】:2020-01-17 08:03:03
【问题描述】:

我有一个数组,其中包含一堆对象和一些键/值对 + 时间戳(moment.js 格式的时间戳)。 我总共有 12 个月的许多时间戳,需要获取每个月的最后一个时间戳并删除其他对象。

其实我什至不知道如何开始。 我已经使用 _.sortBy 按日期对数组进行排序,但不知道如何继续。

array1 = [
{name:name1,timestamp:2018-09-15T07:00:00.0},
{name:name2,timestamp:2018-09-15T12:00:00.0},
{name:name3,timestamp:2018-09-28T05:00:00.0},
{name:name4,timestamp:2018-09-30T01:00:00.0},
{name:name5,timestamp:2018-10-02T10:00:00.0},
{name:name6,timestamp:2018-10-02T11:00:00.0},
{name:name7,timestamp:2018-10-15T07:00:00.0},
{name:name8,timestamp:2018-12-05T08:00:00.0},
{name:name9,timestamp:2018-12-05T09:00:00.0},
{name:name10,timestamp:2018-12-05T10:00:00.0}
]

预期结果是

array1 = [
{name:name4,timestamp:2018-09-30T01:00:00.0},
{name:name7,timestamp:2018-10-15T07:00:00.0},
{name:name10,timestamp:2018-12-05T10:00:00.0}
]

【问题讨论】:

  • 您希望最后一个时间戳基于它们在数组中的显示顺序,还是基于具有该月最新时间戳的条目?例如:如果数组中的最后两个条目切换了时间戳值,您仍然会在结果集中期望name10,还是期望name9?如果您只关心“最后一个基于顺序”@Taki 答案是一个很好的解决方案。如果您希望数组中的值是随机的,并且您希望“基于时间戳的每个月的最后一个条目”它将不起作用。
  • @dusthaines 我想要基于时间戳的最后一个条目。 Taki 的回答很好,但我使用 .map 来创建我需要的数组,然后减少然后再次推送以将条目推送到新数组中以摆脱月份对象本身。

标签: javascript arrays sorting momentjs


【解决方案1】:

reduce 数组到一个以月份为键的对象,每次找到它们时都会覆盖它们,那么你的结果就是 Object.values 的数组:

const array1 = [
  { name: "name1", timestamp: "2018-09-15T07:00:00.0" },
  { name: "name2", timestamp: "2018-09-15T12:00:00.0" },
  { name: "name3", timestamp: "2018-09-28T05:00:00.0" },
  { name: "name4", timestamp: "2018-09-30T01:00:00.0" },
  { name: "name5", timestamp: "2018-10-02T10:00:00.0" },
  { name: "name6", timestamp: "2018-10-02T11:00:00.0" },
  { name: "name7", timestamp: "2018-10-15T07:00:00.0" },
  { name: "name8", timestamp: "2018-12-05T08:00:00.0" },
  { name: "name9", timestamp: "2018-12-05T09:00:00.0" },
  { name: "name10", timestamp: "2018-12-05T10:00:00.0" }
];

const result = array1.reduce((acc, curr) => {
  const month = new Date(curr.timestamp).getMonth() + 1;
  acc[month] = curr;
  return acc;
}, {});

console.log(Object.values(result));

【讨论】:

  • 谢谢!效果很好!我唯一不喜欢的是新创建的月份对象(在我的第一篇文章的评论中提到)但现在我很高兴我有一个可行的解决方案:)
【解决方案2】:

您可以获取日期部分,并将每个条目存储在该日期下的 hastable 中。因此,同一月份的每个条目都将覆盖前一个,并保留最后一个:

 const byMonth = {};

 for(const { name, timestamp } of array1) {
   const month = timestamp.slice(0, 7);
   byMonth[month] = { name, timestamp };
 }

 const result = Object.values(byMonth);

const array1 = [
  {name:"name1",timestamp:"2018-09-15T07:00:00.0"},
  {name:"name2",timestamp:"2018-09-15T12:00:00.0"},
  {name:"name3",timestamp:"2018-09-28T05:00:00.0"},
  {name:"name4",timestamp:"2018-09-30T01:00:00.0"},
  {name:"name5",timestamp:"2018-10-02T10:00:00.0"},
  {name:"name6",timestamp:"2018-10-02T11:00:00.0"},
  {name:"name7",timestamp:"2018-10-15T07:00:00.0"},
  {name:"name8",timestamp:"2018-12-05T08:00:00.0"},
  {name:"name9",timestamp:"2018-12-05T09:00:00.0"},
  {name:"name10",timestamp:"2018-12-05T10:00:00.0"}
];


 const byMonth = {};

 for(const { name, timestamp } of array1) {
   const month = timestamp.slice(0, 7);
   byMonth[month] = { name, timestamp };
 }

const result = Object.values(byMonth);

console.log(result);

【讨论】:

    猜你喜欢
    • 2021-02-22
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多