新属性中的对象数组

时间:2017-08-28 10:42:20

标签: 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:'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)
        }
    }
})

6 个答案:

答案 0 :(得分:1)

如果您确定周末天总是输入数组中的最后两个元素,则可以使用简单的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);

答案 1 :(得分:1)

如果您不确定这些日期的订单:

<button onclick="send('ON');">On</button>

答案 2 :(得分:0)

您可以将字符串转换为日期,然后使用.getDay()方法检查它是哪一天。然后将它放入相应的数组中:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

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

而不是您当前的解决方案,试试这个;

$(document).ready(function () {
    function close_content() {
        alert('closed now');
        $("#content").hide();
    }

    $(document).keyup(function(event) {
        if (event.which == 27) {
            close_content();
        }
    }
    $("#close_content").click(close_content);
});

答案 4 :(得分:0)

添加其他答案并解释您尝试失败的原因: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 : [] }) 可用于将数组“折叠”为单个值,对象或其他内容(这是我们想要的)。

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

map

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

这种方法可以逐步填充单个对象,而不是创建 n 不同的对象,例如typedef T<U> base_t; 版本。

答案 5 :(得分:0)

由于您已经使用momenjs,因此您可以使用map()将数组转换为moment个对象的数组,然后使用filter转换为isoWeekday() method

&#13;
&#13;
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);
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
&#13;
&#13;