Javascript中对象分组后的排序

Javascript中对象分组后的排序,javascript,object,lodash,Javascript,Object,Lodash,假设我有以下数据: const collection = [ { callId: "1", deadline: null }, { callId: "1", deadline: null }, { callId: "3", deadline: "2020-04-02T13:3

假设我有以下数据:

const collection = [
        {
            callId: "1",
            deadline: null
        },
        {
            callId: "1",
            deadline: null
        },
        {
            callId: "3",
            deadline: "2020-04-02T13:37:00.000Z" //assume its a JS date object
        },
        {
            callId: "3",
            deadline: "2020-04-06T08:33:00.000Z" //assume its a JS date object
        },
        {
            callId: "2",
            deadline: null
        },
        {
            callId: "2",
            deadline: "2020-04-06T08:33:00.000Z" //assume its a JS date object
        },
    ]
我想按
callId
对它们进行分组,但要按
截止日期对分组数据进行排序。所以我想要的结果是:

const sorted = {
        "3": [
            {
                callId: "3",
                deadline: "2020-04-02T13:37:00.000Z"
            },
            {
                callId: "3",
                deadline: "2020-04-06T08:33:00.000Z"
            },
        ],
        "2": [
            {
                callId: "2",
                deadline: "2020-04-06T08:33:00.000Z"
            },
            {
                callId: "2",
                deadline: null
            },
        ],
        "1": [
            {
                callId: "1",
                deadline: null
            },
            {
                callId: "1",
                deadline: null
            },
        ],
    }
我尝试使用
lodash

const groupedData = _groupBy(collection, 'callId')
const sortedData = _sortBy(groupedData, [function (resultItem) {
        return _map(resultItem, function (value) {
            return value.deadline == null;
        });
    }]);
但我没能得到正确的结果:

[
[
    {
        "callId": "3",
        "deadline": "2020-04-02T13:37:00.000Z"
    },
    {
        "callId": "3",
        "deadline": "2020-04-06T08:33:00.000Z"
    }
],
[
    {
        "callId": "2",
        "deadline": null
    },
    {
        "callId": "2",
        "deadline": "2020-04-06T08:33:00.000Z"
    }
],
[
    {
        "callId": "1",
        "deadline": null
    },
    {
        "callId": "1",
        "deadline": null
    }
]
]

首先根据日期对数组排序,然后使用JavaScript的内置方法

let集合=[
{
卡里德:“1”,
截止日期:空
},
{
卡里德:“1”,
截止日期:空
},
{
卡里德:“3”,
截止日期:“2020-04-02T13:37:00.000Z”
},
{
卡里德:“3”,
截止日期:“2020-04-06T08:33:00.000Z”
},
{
卡里德:“2”,
截止日期:空
},
{
卡里德:“2”,
截止日期:“2020-04-06T08:33:00.000Z”
},
]
//基于日期排序(将在最后一个位置放置空值)
集合=集合。排序((a,b)=>{
如果(a.deadline==null){
返回1;
}
else if(b.截止日期===null){
返回-1;
}否则{
返回新日期(a.截止日期)-新日期(b.截止日期)
}
})
//使用reduce方法将数组转换为对象
const group=collection.reduce((a,c)=>({
A.
//检查密钥是否已存在,
//如果是,则将该项附加到数组中
//或者创建一个新数组
[c.callId]:a[c.callId]?[…a[c.callId],c]:[c]
}), {})

console.log(分组)
是否要对
进行排序
?作为对象?按最近的日期进行良好排序,并按呼叫进行分组。您不能按具有索引键的键对对象进行排序。您好,谢谢您的回答,但这不会按截止日期对其进行排序。在我的回答中添加了排序。目前它将null放在顶部,如果这是您想要的结果,那么没有问题。向上投票。我这边唯一的一条评论是:
sort()
变异了源数组,因此将其应用于源数组浅拷贝(即
[…集合].sort(…
)会更安全.不,但这并不能回答我的问题。请在我的问题中检查我要查找的结果。您的结果将集合排序回callId…因此它显示1,2,3 id的顺序应该是,3,2,1…并且id 2下的数据也需要排序,以便首先具有截止日期的对象。