【问题标题】:group array of object in new properties新属性中的对象组数组
【发布时间】:2017-08-28 10:42:20
【问题描述】:
[{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'}]

我有上述数据,我尝试将最后 2 项分组并给它一个属性“周末”,其余的是“工作日”,我的预期输出是这样的

{
    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'}]
}

我的尝试失败了

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

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

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

【问题讨论】:

    标签: javascript ecmascript-6 momentjs


    【解决方案1】:

    如果您不确定日期的顺序:

    days = [{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'}]
    
    const isWeekend = day => (
      [6, 0].includes(new Date(day.date).getDay())
    );
    
    const separate = (days) => {
      const weekends = [];
      const weekdays = [];
      days.forEach((day) => {
        isWeekend(day) ? weekends.push(day) : weekdays.push(day);
      });
      return { weekends, weekdays };
    };
    
    console.log(separate(days));

    【讨论】:

      【解决方案2】:

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

      var inputArray = [{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'}],
      outputArray = {
        weekdays: inputArray.slice(0,5),
        weekends: inputArray.slice(6)
      };
      
      console.log(outputArray);

      【讨论】:

        【解决方案3】:

        添加其他答案并解释您的尝试失败的原因:这是Array.reduce而不是Array.map的情况。后者旨在为输入数组中的每个元素返回一个元素,而reduce 可用于将数组“折叠”为单个值、对象或其他东西(这是我们想要的)。

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

        const outObj = inArr.reduce(function(obj, current, i) {
            if(i >= 5) { // or other check for weekend, depending on your data
              return Object.assign(obj, { weekends : obj.weekends.push(current) })
            } else {
              return Object.assign(obj, { weekdays : obj.weekdays.push(current) })
            }
          }, { weekdays : [], weekends : [] })
        

        在上面的代码 sn-p 中,我们传入的函数在每个输入元素上运行,就像 map 一样。关键的区别在于它可以访问函数最后一次运行产生的输出,该输出作为第一个参数传入(在本例中称为obj)。顺便说一下,传递给reduce 的第二个参数是obj 的初始状态(具有两个空列表的对象)。

        这种方法可以逐渐填充单个对象,而不是像您的 map 版本那样创建 n 个不同的对象。

        【讨论】:

          【解决方案4】:

          既然您已经在使用momenjs,那么您可以使用map() 将您的数组转换为moment 对象数组,然后使用isoWeekday() method 简单地将filter

          var array = [{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'}];
          
          var momentArray = array.map(function(d){ return moment(d.date, "YYYY-M-D"); });
          
          var obj = {
              weekdays: momentArray.filter(function(d){ return d.isoWeekday() < 6 }),
              weekends: momentArray.filter(function(d){ return d.isoWeekday() > 5 })
          };
          
          console.log(obj);
          &lt;script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"&gt;&lt;/script&gt;

          【讨论】:

            【解决方案5】:

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

            var array = [{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'}];
            var obj = {
                weekdays: [],
                weekends: []
            };
            
            array.forEach((el, key) => {
                if(new Date(el.date).getDay() === 0 || new Date(el.date).getDay() === 6) obj.weekends.push(el); else obj.weekdays.push(el);
            });
            
            console.log(obj);

            【讨论】:

              【解决方案6】:

              您既没有返回变量也没有返回数组。 尝试使用 foreach 并将您的属性添加到变量中。

              代替您当前的解决方案,试试这个;

              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);}});
              

              【讨论】:

              • 你的回答不错但还不够,最好贴个代码示例
              猜你喜欢
              • 2018-11-13
              • 2023-03-18
              • 1970-01-01
              • 2016-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-14
              相关资源
              最近更新 更多