完成需求没找到轮子临时写的
暂不支持排序和时分秒,有空再完善,欢迎交流提建议啊!
/**
* 集合根据日期分组
* @param {Array} list
* @param {String} dateKey 分组日期属性
* @param {Number} [type=1] 分组类型 0.年 1.月 2.日
*
* @returns {Map<String, Array>} 日期(yyyy-MM-dd)-集合
*/
export const groupByDate = function(list, dateKey, type=1) {
const result = new Map()
if(!list || !list.length || !dateKey) return result
function generateMapKey(date) {
if(type === 2) {
return date
}
const dates = date.split("-")
if(type === 0) {
return `${dates[0]}-1-1`
}
if(type === 1) {
return `${dates[0]}-${dates[1]}-1`
}
}
list.map(item => {
const mapKey = generateMapKey(item[dateKey])
let dataList = result.get(mapKey)
if(!dataList) {
result.set(mapKey, (dataList = []))
}
dataList.push(item)
})
return result
}
测试数据
const testList = [
{
date: '2021-10-1',
name: '二一十月'
},
{
date: '2021-9-1',
name: '二一九月'
},
{
date: '2021-9-21',
name: '二一九月'
},
{
date: '2021-9-30',
name: '二一九月'
},
{
date: '2021-8-1',
name: '二一八月'
},
{
date: '2021-8-1',
name: '二一八月'
},
{
date: '2020-9-1',
name: '二O九月'
},
{
date: '2020-9-1',
name: '二O九月'
},
]
使用
// 按年: Map(2) {'2021-1-1' => Array(6), '2020-1-1' => Array(2)}
groupByDate(testList, 'date', 0)
// 按月: Map(4) {'2021-10-1' => Array(1), '2021-9-1' => Array(3), '2021-8-1' => Array(2), '2020-9-1' => Array(2)}
groupByDate(testList, 'date', 1)
// 按日: Map(6) {'2021-10-1' => Array(1), '2021-9-1' => Array(1), '2021-9-21' => Array(1), '2021-9-30' => Array(1), '2021-8-1' => Array(2), …}
groupByDate(testList, 'date', 2)