在Javascript中,每天将ISO 8601日期的排序数组拆分为新的2d数组
我试图将包含ISO 8601(UTC)日期的排序数组拆分为二维数组,其中每天表示一个数组,该数组包含年/月/日匹配的所有日期 示例阵列:在Javascript中,每天将ISO 8601日期的排序数组拆分为新的2d数组,javascript,arrays,node.js,Javascript,Arrays,Node.js,我试图将包含ISO 8601(UTC)日期的排序数组拆分为二维数组,其中每天表示一个数组,该数组包含年/月/日匹配的所有日期 示例阵列: let dates = [ '2019-07-14T08:02:27Z', '2019-07-05T17:22:34Z', '2019-06-25T21:23:30Z', '2019-06-25T16:46:55Z', '2019-06-18T14:14:15Z', '2019-06-18T13:09:07Z'
let dates = [
'2019-07-14T08:02:27Z',
'2019-07-05T17:22:34Z',
'2019-06-25T21:23:30Z',
'2019-06-25T16:46:55Z',
'2019-06-18T14:14:15Z',
'2019-06-18T13:09:07Z'
];
理想情况下,上述阵列将创建以下2D阵列:
let dates = [
['2019-07-14T08:02:27Z'],
['2019-07-05T17:22:34Z'],
['2019-06-25T21:23:30Z', '2019-06-25T16:46:55Z'],
['2019-06-18T14:14:15Z', '2019-06-18T13:09:07Z']
];
我尝试了很多方法,但为了提供一些代码,我对每个数组元素进行子字符串date[I]。子字符串(0,10)
,返回年/月/日,比如2019-07-14
——由于数组已排序,我将比较上一个元素和当前元素,并决定是否应将该元素添加到新数组中
让arr=[],temp=[];
for(设i=0,prev=null;i
在某些情况下,代码不起作用,因为它被关闭一次,例如:
[ '2019-07-14T08:02:27Z' ],
[ '2019-07-10T14:22:04Z' ],
[ '2019-07-09T16:08:22Z' ], // should be in below array
[
'2019-07-09T15:58:55Z',
'2019-07-09T14:41:49Z',
'2019-07-09T14:12:04Z',
'2019-07-09T14:10:29Z',
'2019-07-09T13:34:46Z',
'2019-07-09T13:28:14Z',
'2019-07-08T15:51:38Z' // conflicting dates
],
[ '2019-07-08T15:45:07Z', '2019-07-07T15:07:47Z' ], // conflicting dates
有什么建议吗?让arr=[],temp=[];
let arr = [], temp = [];
for (let i = 0, prev = null; i < dates.length; i++) {
if (
prev &&
!(dates[i].substring(0, 10) === prev)
) {
arr.push(temp);
temp = [];
}
temp.push(dates[i]);
prev = dates[i].substring(0, 10);
}
arr.push(temp);
for(设i=0,prev=null;i
只需维护一个包含所有日期的映射,并持续将日期推送到数组中(如果它们存在于映射中),映射上的Object.values()
将为您提供所需的结果,即使日期未排序,这也可以正常工作:
let dates=['2019-07-14T08:02:27Z','2019-07-05T17:22:34Z','2019-06-25T21:23:30Z','2019-06-25T16:46:55Z','2019-06-18T14:14:15Z','2019-06-18T13:09:07Z';
让result=Object.values(dates.reduce)(acc,d)=>{
设日期=d.subsr(0,10);
(acc[日期]=acc[日期]| |[])。推送(d);
返回acc;
},{}));
console.log(result)代码>您可以通过检查日期子字符串来减少数组
let dates=['2019-07-14T08:02:27Z','2019-07-05T17:22:34Z','2019-06-25T21:23:30Z','2019-06-25T16:46:55Z','2019-06-18T14:14:15Z','2019-06-18T13:09:07Z'],
结果=日期。减少((r,s,i)=>{
如果(!i | | r[r.length-1][0].slice(0,10)!==s.slice(0,10))r.push([]);
r[r.length-1]。推送;
返回r;
}, []);
控制台日志(结果)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以使用函数生成器根据所需条件对日期进行分组
这可能会比其他解决方案更紧凑,但应该更易于维护和阅读
下面的示例一次获取两个日期,并对照下一个日期检查当前日期(第一个)是否满足提供的条件。如果是,则将其累积并继续,否则将产生上一个块并继续循环直到完成
实施情况如下:
let dates=[
“2019-07-14T08:02:27Z”,
“2019-07-05T17:22:34Z”,
“2019-06-25T21:23:30Z”,
“2019-06-25T16:46:55Z”,
“2019-06-18T14:14:15Z”,
“2019-06-18T13:09:07Z”
];
函数*groupSimilarDates(dateArr,条件){
var acc=[];
对于(变量i=0;i log([…groupsimilardate(日期,(a,b)=>a.substring(0,10)==b.substring(0,10)))代码>他们必须保留字符串吗?因为如果你先把它们变成日期对象,事情就会变得容易得多。(“选择正确的数据结构,您的问题就不再是问题了”)如果这有助于阅读:r
是acgregatedresult
,s
是iteratedElement
,i
是iteratedIndex
,!i
仅在第一次迭代中为真
。