如何在 JavaScript 数组中拆分日期字符串

How to split date strings in JavaScript array

提问人:JS_is_awesome18 提问时间:5/16/2022 更新时间:5/16/2022 访问量:381

问:

对于以下 Month/Day/Year 日期字符串数组...

const array1 = ["05/31/2022", "06/01/2022", "06/02/2022"]

...我正在尝试将数组配置为切片并删除所有日期字符串数组项(以 01 作为 Day 开头),如果它们紧跟在以 31 作为 Day 的日期字符串数组项之后。第 30 天和第 01 天的情况也是如此。

为了解决这个问题,我设置了一个 for 语句来遍历数组中的所有字符串。然后,我使用拆分方法从每个数组项中删除“/”,从而将 MM,DD,YYYY 分解为单独的变量。

for (let i = 0; i < array1.length; i++) {
  var [month, day, year] = array1[i].split('/');
  console.log(month, day, year)
}

我下一步的意图是设置一个条件,检查包含 30 或 31 作为“天”的数组项是否后跟包含 01 作为“天”的数组项,然后使用切片更快地删除后续日期 30 日或 31 日。对于这一部分,我尝试将月、日和年重新合并为单独的数组项目,如下所示:

const newArray = []

for (let i = 0; i < array1.length; i++) {
  var [month, day, year] = array1[i].split('/');
  newArray.push(month + day + year)
  console.log(newArray)
}

带输出:

 ['05312022', '06012022', '06022022']

但是,我不确定如何设置一个条件来检查包含 30 或 31 作为“天”的数组项是否后跟包含 01 作为“天”的数组项。我该如何进行此类检查的功能?

JavaScript 数组循环 for 循环 切片

评论

0赞 cmgchess 5/16/2022
所以最终数组应该是?["06/02/2022"]
0赞 JS_is_awesome18 5/16/2022
最终数组应为 [“5/31/2022”]。如果数组项“05/31/2022”后跟“06/01/2022”,则应删除“05/31/2022”之后的所有数组项。
0赞 JS_is_awesome18 5/16/2022
这意味着,如果日期值为 31 的数组项后跟日期值为 01 的数组项,则应删除日期值为 31 的数组项之后的所有数组项。
0赞 SSM 5/16/2022
这个数组的输出应该是什么?["05/31/2022", "06/01/2022", "07/01/2022"]
0赞 JS_is_awesome18 5/16/2022
最终输出应为 [“5/31/2022”]

答:

1赞 SSM 5/16/2022 #1

您可以遍历数组并获取 and,如果满足条件,则对数组进行切片并返回它。datescurrDayprevDaydates

const solution = (dates) => {
  for (let i = 1; i < dates.length; i++) {
    const currDay = dates[i].slice(3, 5);
    const prevDay = dates[i - 1].slice(3, 5);
    if ((currDay === "01") & (prevDay === "31" || prevDay === "30")) {
      return dates.slice(0, i);
    }
  }
  return dates;
};

console.log(solution(["05/31/2022", "06/01/2022", "06/02/2022"]));

0赞 PeterKA 5/16/2022 #2

以下我们esArray#reduce

  • 保留所有元素,除非
  • 保留的元素数等于正在考虑的索引,并且当前元素具有日期并跟在 a 或 a 之后013031
  • 如果考虑的索引大于保留的项数,则表示至少跳过了一个元素,则也会跳过当前元素。

const array1 = ["05/31/2022", "06/01/2022", "06/02/2022"],

      output = array1.reduce(
          (prev,cur,i) => 
          prev.length && ["30","31"].includes( prev.slice(-1)[0].slice(3,5) ) && 
          (prev.length === i && cur.slice(3,5) === "01" || i > prev.length) ?
              prev :
              [...prev, cur],
          []
      );
      
console.log( output );