如何拆分 JavaScript 数组中的日期字符串
How to split date strings in JavaScript array
对于以下 Month/Day/Year 日期字符串数组...
const array1 = ["05/31/2022", "06/01/2022", "06/02/2022"]
...我正在尝试将数组配置为切片并删除所有日期字符串数组项(从 01 作为日期开始),如果它们跟在日期字符串数组项之后,并且日期为 31。第 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 作为“天”的数组项,然后使用 slice 来删除后续日期更快 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 作为“天”的数组项。我怎样才能实现这种检查的功能?
您可以遍历 dates
数组并获取 currDay
和 prevDay
,如果满足条件,则切片 dates
数组和 return它。
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"]));
以下使用Array#reduce
到
- 保留所有元素,除非
- 保留的元素数等于正在考虑的索引,当前元素的日期为
01
并且跟在 30
或 31
之后
- 如果所考虑的索引大于保留的项目数,意味着至少已跳过一个元素,则也将跳过当前元素。
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 );
对于以下 Month/Day/Year 日期字符串数组...
const array1 = ["05/31/2022", "06/01/2022", "06/02/2022"]
...我正在尝试将数组配置为切片并删除所有日期字符串数组项(从 01 作为日期开始),如果它们跟在日期字符串数组项之后,并且日期为 31。第 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 作为“天”的数组项,然后使用 slice 来删除后续日期更快 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 作为“天”的数组项。我怎样才能实现这种检查的功能?
您可以遍历 dates
数组并获取 currDay
和 prevDay
,如果满足条件,则切片 dates
数组和 return它。
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"]));
以下使用Array#reduce
到
- 保留所有元素,除非
- 保留的元素数等于正在考虑的索引,当前元素的日期为
01
并且跟在30
或31
之后
- 如果所考虑的索引大于保留的项目数,意味着至少已跳过一个元素,则也将跳过当前元素。
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 );