Javascript 新属性中对象的组数组

Javascript 新属性中对象的组数组,javascript,ecmascript-6,momentjs,Javascript,Ecmascript 6,Momentjs,我有上面的数据,我试着把最后两个项目分组,给它一个属性“周末”,剩下的是“工作日”,我的预期产出是这样的 [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}] 我的尝试失败了 { weekdays: [{date:'2017-8-1'},{date:'

我有上面的数据,我试着把最后两个项目分组,给它一个属性“周末”,剩下的是“工作日”,我的预期产出是这样的

[{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'},{date:'2017-8-8'},{date:'2017-8-9'}]
我的尝试失败了

{
    weekdays: [{date:'2017-8-1'},{date:'2017-8-2'},{date:'2017-8-3'},{date:'2017-8-5'},{date:'2017-8-6'},{date:'2017-8-7'}],
    weekends: [{date:'2017-8-8'},{date:'2017-8-9'}]
}

如果您确定周末总是输入数组中的最后两个元素,那么可以使用一个简单的
切片

var-inputArray=[{日期:'2017-8-1'},{日期:'2017-8-2'},{日期:'2017-8-3'},{日期:'2017-8-5'},{日期:'2017-8-6'},{日期:'2017-8-7'},{日期:'2017-8-8'},{日期:'2017-8-9'},
输出阵列={
工作日:inputArray.slice(0,5),
周末:inputArray.slice(6)
};

控制台日志(输出阵列)
您可以将字符串转换为日期,然后使用
.getDay()
方法检查日期。然后将其放入相应的数组中,如下所示:

newOb = {};
Array.forEach((o,i)=>{
If(i>(array.length-2)-1){
newOb.weekend == undefined? newOb.weekend=[o]:newOb.weekend.push(o);}
else{
newOb.weekday == undefined? newOb.weekday = [o]: newOb.weekday.push(o);}});
var数组=[{日期:'2017-8-1'},{日期:'2017-8-2'},{日期:'2017-8-3'},{日期:'2017-8-5'},{日期:'2017-8-6'},{日期:'2017-8-7'},{日期:'2017-8-8'},{日期:'2017-8-9'};
var obj={
工作日:[],
周末:[]
};
array.forEach((el,key)=>{
如果(新日期(el.Date).getDay()==0 | |新日期(el.Date).getDay()==6)对象周末推送(el);否则对象周日推送(el);
});

控制台日志(obj)既不返回变量也不返回数组。 尝试使用foreach并将属性添加到变量中

试试这个,而不是你目前的解决方案

data.map((obj, i) => {

    if(data.length - (i + 1) >= 2) {
        return {
            weekdays: {
                date: moment(obj.date)
            }
        }
    }

    return {
        weekends: {
            date: moment(obj.date)
        }
    }
})

要添加到其他答案中并解释您的尝试失败的原因,请执行以下操作:
Array.reduce
而不是
Array.map
。后者用于为输入数组中的每个元素返回一个元素,而
reduce
可用于将数组“折叠”为单个值、对象或其他内容(这是我们想要的)

优雅的解决方案可能如下所示:

newOb = {};
Array.forEach((o,i)=>{
If(i>(array.length-2)-1){
newOb.weekend == undefined? newOb.weekend=[o]:newOb.weekend.push(o);}
else{
newOb.weekday == undefined? newOb.weekday = [o]: newOb.weekday.push(o);}});
在上面的代码片段中,我们传入的函数在每个输入元素上运行,如
map
。关键的区别在于,它可以访问函数最后一次运行产生的输出,该输出作为第一个参数传入(在本例中称为
obj
)。顺便说一下,传递给
reduce
的第二个参数是
obj
的初始状态(一个有两个空列表的对象)


这种方法可以逐渐填充单个对象,而不是创建n个不同的对象,如
地图版本。

如果您不确定日期顺序:

days=[{日期:'2017-8-1'},{日期:'2017-8-2'},{日期:'2017-8-3'},{日期:'2017-8-5'},{日期:'2017-8-6'},{日期:'2017-8-7'},{日期:'2017-8-8'},{日期:'2017-8-9'}]
const isWeekend=天=>(
[6,0]。包括(新日期(day.Date).getDay()
);
常数分离=(天)=>{
常数周末=[];
常量工作日=[];
每天的天数((天)=>{
周末(天)?周末。推送(天):工作日。推送(天);
});
返回{周末、工作日};
};
控制台日志(单独(天))既然您已经在使用,那么您可以使用并简单使用以下命令将数组转换为
对象数组:

var数组=[{日期:'2017-8-1'},{日期:'2017-8-2'},{日期:'2017-8-3'},{日期:'2017-8-5'},{日期:'2017-8-6'},{日期:'2017-8-7'},{日期:'2017-8-8'},{日期:'2017-8-9'};
var瞬时射线=数组.map(函数(d){返回时刻(d.date,“YYYY-M-d”);});
var obj={
工作日:瞬时光线.filter(函数(d){return d.isoWeekday()<6}),
周末:瞬时光线.filter(函数(d){return d.isoWeekday()>5})
};
控制台日志(obj)

你的答案很好,但还不够,最好发布一个代码示例