日期多条件分组疑惑

原始数据

const arr = [
        {
            "id": 255,
            "name": "上午班",
            "user_id": 14,
            "time_from": "2021-03-10",
            "time_to": "2021-03-10"
        },
        {
            "id": 256,
            "name": "下午班",
            "user_id": 14,
            "time_from": "2021-03-10",
            "time_to": "2021-03-10"
        },
        {
            "id": 260,
            "name": "晚班",
            "user_id": 14,
            "time_from": "2021-03-10", // 跨日期
            "time_to": "2021-03-11" // 跨日期
        },
        {
            "id": 261,
            "name": "上午班",
            "user_id": 14,
            "time_from": "2021-03-11",
            "time_to": "2021-03-11"
        }
    ]

其中晚班 time_fromtime_to 是跨日期。

希望通过time_fromtime_to进行分组。只要time_from和time_to有一个满足分组条件。就归到一类。
例如下面数据满足了time_from2021-03-10和time_to为2021-03-11,所以都归类到了2021-03-102021-03-11

{
    "id": 260,
    "name": "晚班",
    "user_id": 14,
    "time_from": "2021-03-10",
    "time_to": "2021-03-11"
}

最终得到如下格式

[
        {
            "date": "2021-03-10",
            "list": [
                {
                    "id": 255,
                    "name": "上午班",
                    "user_id": 14,
                    "time_from": "2021-03-10",
                    "time_to": "2021-03-10"
                },
                {
                    "id": 256,
                    "name": "下午班",
                    "user_id": 14,
                    "time_from": "2021-03-10",
                    "time_to": "2021-03-10"
                },
                {
                    "id": 260,
                    "name": "晚班",
                    "user_id": 14,
                    "time_from": "2021-03-10",
                    "time_to": "2021-03-11"
                }
            ]
        },
        {
            "date": "2021-03-11",
            "list": [
                {
                    "id": 260,
                    "name": "晚班",
                    "user_id": 14,
                    "time_from": "2021-03-10",
                    "time_to": "2021-03-11"
                },
                {
                    "id": 261,
                    "name": "上午班",
                    "user_id": 14,
                    "time_from": "2021-03-11",
                    "time_to": "2021-03-11"
                }
            ]
        }
    ]

如何转换

阅读 1.1k
1 个回答
var arr = [
        {
            "id": 255,
            "name": "上午班",
            "user_id": 14,
            "time_from": "2021-03-10",
            "time_to": "2021-03-10"
        },
        {
            "id": 256,
            "name": "下午班",
            "user_id": 14,
            "time_from": "2021-03-10",
            "time_to": "2021-03-10"
        },
        {
            "id": 260,
            "name": "晚班",
            "user_id": 14,
            "time_from": "2021-03-10", // 跨日期
            "time_to": "2021-03-11" // 跨日期
        },
        {
            "id": 261,
            "name": "上午班",
            "user_id": 14,
            "time_from": "2021-03-11",
            "time_to": "2021-03-11"
        }
    ];

Object.entries(arr.reduce((res, item) => {
  addItem(res, item, 'time_from');
  addItem(res, item, 'time_to');
  return res;
}, {})).map(([date,value]) => ({date,list: value.list}));

function addItem(result, item, key) {
  const value = result[item[key]];
  if(value) {
    if(!value.ids.has(item.id)) {
      value.list.push(item);
      value.ids.add(item.id)
    }
  } else {
    result[item[key]] = {ids: new Set([item.id]), list: [item]}
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题