繁体   English   中英

按时差分组JavaScript数组

[英]Grouping a javascript array by time difference

输入示例:

var Player = [
    {
        name: "John",
        Events: {
            timeList: ["7:00 AM", "9:00 AM", "12:01 PM", "2:00 PM"]
        },
        groups: {}
    },
    {
        name: "Doe",
        Events: {
            timeList: ["7:00 AM", "8:00 AM", "10:00 AM", "12:01 PM"]
        },
        groups: {}
    }
];

我试图遍历每个玩家的timeList数组,并将该数组中的每个项目按小于2小时的时间差进行分组。

我尝试遍历数组中的每个元素并编写一个if条件,以查看哪些元素匹配。 但是,我无法将分组的元素推入单独的数组中。

预期产量:

Player = [
    {
        name: "John",
        Events: {
            timeList: ["7:00 AM", "9:00 AM", "12:01 PM", "2:00 PM"]
        },
        groups: {0: ["7:00 AM", "9:00 AM"], 1: ["12:01 PM", "2:00 PM"]}
    },
    {
        name: "Doe",
        Events: {
            timeList: ["7:00 AM", "8:00 AM", "9:00 AM", "12:01 PM"]
        },
        groups: {0: ["7:00 AM", "8:00 AM", "9:00 AM"], 1: ["12:01 PM"]}
    }
];

如果需要,可以更改对象的结构。

提前一吨。

编写一个函数来标准化您的时间,编写一个函数来比较时间与上一次给出的时间(初始条件为-Infinity ),循环遍历您的Arrays

function timeInMin(str) {
    str = str.split(/[: ]/);
    if (str[0] === '12') {
        if (str[2] === 'AM') {
            str[1] = 0;
        }
    } else if (str[2] === 'PM') {
        str[0] = (+str[0]) + 12;
    }
    return 60 * (+str[0]) + (+str[1]);
}

function groupFactory(groups) {
    var i = -1, last = -Infinity;
    groups = groups || {};
    return function addToGroup(time) {
        var mins = timeInMin(time);
        if (mins - last <= 2 * 60) {
            groups[i].push(time);
        } else {
            ++i;
            groups[i] = [time];
        }
        last = mins;
        return groups;
    };
}

var i, j, gf;
for (i = 0; i < Player.length; ++i) {
    gf = groupFactory(Player[i].groups);
    for (j = 0; j < Player[i].Events.timeList.length; ++j) {
        gf(Player[i].Events.timeList[j]);
    }
}

结果是

[
    {
        "name": "John",
        "Events": {
            "timeList": ["7:00 AM", "9:00 AM", "12:01 PM", "2:00 PM"]
        },
        "groups": {
            "0": ["7:00 AM", "9:00 AM"],
            "1": ["12:01 PM","2:00 PM"]
        }
    },
    {
        "name": "Doe",
        "Events": {
            "timeList": ["7:00 AM", "8:00 AM", "10:00 AM", "12:01 PM"]
        },
        "groups": {
            "0": ["7:00 AM", "8:00 AM", "10:00 AM"],
            "1": ["12:01 PM"]
        }
    }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM