Javascript 按周将对象数组拆分为组

Javascript 按周将对象数组拆分为组,javascript,arrays,Javascript,Arrays,我有一个包含如下数据的对象数组 [{ date: "01-01-2017 00:00:00", dataField1: "", dataField2: "" }, { date: "01-02-2017 00:00:00", dataField1: "", dataField2: "" }, { date: "01-15-2017 00:00:00", dataField1: "", dataField2: "" }, { date: "01-16-201

我有一个包含如下数据的对象数组

[{
  date: "01-01-2017 00:00:00",
  dataField1: "",
  dataField2: ""
},
{
  date: "01-02-2017 00:00:00",
  dataField1: "",
  dataField2: ""
},
{
  date: "01-15-2017 00:00:00",
  dataField1: "",
  dataField2: ""
},
{
  date: "01-16-2017 00:00:00",
  dataField1: "",
  dataField2: ""
},
{
  date: "01-15-2018 00:00:00",
  dataField1: "",
  dataField2: ""
},
{
  date: "01-16-2018 00:00:00",
  dataField1: "",
  dataField2: ""
}]]
UPD:需要按年份和月份排序,而不仅仅是月份。 我需要将其拆分为一个数组,其中对象按周和年分组。 大概是这样的:

[
  [{
     date: "01-01-2017 00:00:00",
     dataField1: "",
     dataField2: ""
   },
   {
     date: "01-02-2017 00:00:00",
     dataField1: "",
     dataField2: ""
   }
  ],
  [{
     date: "01-15-2017 00:00:00",
     dataField1: "",
     dataField2: ""
   },
   {
     date: "01-16-2017 00:00:00",
     dataField1: "",
     dataField2: ""
   }],
   [
    {
       date: "01-15-2018 00:00:00",
       dataField1: "",
       dataField2: ""
    },
    {
       date: "01-16-2018 00:00:00",
       dataField1: "",
       dataField2: ""
    }
   ]
]

是否有一种简单且性能良好的方法可以使用javascript进行排序?

我碰巧有一些方法来确定排序结果

从这里开始,只需将日期字符串拆分为可传递给本机的可用部分,然后将对象向下转换为带有键的对象,这样我们就可以将日期放入正确的组中,最后,根据您的请求,使用

var日期=[{
日期:“2017年1月1日00:00:00”,
数据字段1:“”,
数据字段2:“
},
{
日期:“2017年2月1日00:00:00”,
数据字段1:“”,
数据字段2:“
},
{
日期:“2017年1月15日00:00:00”,
数据字段1:“”,
数据字段2:“
},
{
日期:“2017年1月16日00:00:00”,
数据字段1:“”,
数据字段2:“
}
];
var组=对象.值(日期.减少((acc,val)=>{
var dateparts=val.date.split(/|-|:/g);
var date=新日期(日期部分[2],日期部分[0]-1,日期部分[1],日期部分[3],日期部分[4],日期部分[5]);
var weekNo=getISO8601WeekNo(日期);
如果(!acc[weekNo])acc[weekNo]=[];
acc[weekNo]。推送(val);
返回acc;
}, {}));
控制台日志(组);
函数getISO8601WeekNo(日期){
var startDate=新日期(Date.getFullYear(),0);
var endDate=新日期(Date.getFullYear(),Date.getMonth(),Date.getDate());
而(endDate.getDay()<6)endDate.setDate(endDate.getDate()+1);
endDate=endDate.getTime();
var-weekNo=0;
while(startDate.getTime()} /代码> 如果你考虑使用类似的东西,你可以使用格式化函数。这样,您实际上可以按列出的任何可用日期格式标记进行分组

函数datesGroupByComponent(日期、标记){
返回日期。减少(功能(val、obj){
让comp=时刻(obj['date'],'MM/DD/yyyyy')。格式(令牌);
(val[comp]=val[comp]| |[])。推送(obj);
返回val;
}, {});
}
常数日期=[
{日期:“01-01-2017 00:00:00”},
{日期:“01-02-2017 00:00:00”},
{日期:“01-15-2017 00:00:00”},
{日期:“01-16-2017 00:00:00”}
];
/* https://momentjs.com/docs/#/displaying/format */
console.log('D',datesGroupByComponent(dates,'D'));//日期
console.log('w',datesGroupByComponent(dates,'w'));//一年中的一周
console.log('W',datesGroupByComponent(dates,'W'));//年度周(ISO)

如果使用lodash,则u.groupBy else使用lodash
;)如果您想坚持使用vanilla JS,那么您可以遍历数据列表,并将其放入一个对象/映射中,其中键是一周的编号。这不是一个“排序”的事情,这是一个“分组”的事情。到目前为止你试过什么?请发一些代码。非常感谢!你帮我节省了很多时间!刚刚更改了regex
var dateparts=val.date.split(/|-|:/g)用于
var dateparts=val.date.split(/T+|-|:/g)
支持这样的日期格式
2017-01-04T00:00:00-05:00
非常欢迎:D如果这样做了,请记住点击左侧的复选标记,将其标记为已接受的答案@AlexAL@occams-剃刀去除了复选标记。刚起床。还需要按年份排序,而不仅仅是月份。但解决是好的:)得到了一些任务的更新。如果我将
YYYY-W
传递给
datesGroupedBy
它会工作。谢谢