Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,每天将ISO 8601日期的排序数组拆分为新的2d数组_Javascript_Arrays_Node.js - Fatal编程技术网

在Javascript中,每天将ISO 8601日期的排序数组拆分为新的2d数组

在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'

我试图将包含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'   
];
理想情况下,上述阵列将创建以下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;ilog([…groupsimilardate(日期,(a,b)=>a.substring(0,10)==b.substring(0,10)))他们必须保留字符串吗?因为如果你先把它们变成日期对象,事情就会变得容易得多。(“选择正确的数据结构,您的问题就不再是问题了”)如果这有助于阅读:
r
acgregatedresult
s
iteratedElement
i
iteratedIndex
!i
仅在第一次迭代中为