基于 2 个属性组合的 groupBy 数组

groupBy array based on combination of 2 properties

我想根据 2 个属性的组合对数组元素进行分组。

我有一个包含 FirstDateLastDate 的数组,我想用 FirstDateLastDate 的相同组合对对象进行分组,并创建具有任何随机唯一性的对象字符串作为键或数组数组任何东西都可以。

我有以下数组,

const data = [ 
    { 
       InvDate: "2021-05-04 00:00:00",
       EntityID: 4309,
       FirstDate: "2021-05-03 18:30:00",
       LastDate: "2021-05-04 18:30:00"
    },
    {  
       InvDate: "2021-05-04 00:00:00",
       EntityID: 4314,
       FirstDate: "2021-05-03 18:30:00",
       LastDate: "2021-05-04 18:30:00"
    },
    {  
       InvDate: "2021-05-04 00:00:00",
       EntityID: 4464,
       FirstDate: "2021-05-01 18:30:00",
       LastDate: "2021-05-04 18:30:00"
    },
    {  
       InvDate: "2021-05-04 00:00:00",
       EntityID: 4465,
       FirstDate: "2021-04-20 18:30:00",
       LastDate: "2021-05-04 18:30:00"
    }
]

我想对具有相似 FirstDateLastDate 的对象进行分组,因此例如结果应该如下所示,

// Array of arrays example
const result1 = [ 
    [
        { 
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4309,
            FirstDate: "2021-05-03 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        },
        {  
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4314,
            FirstDate: "2021-05-03 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        },
    ],
    [
        {  
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4464,
            FirstDate: "2021-05-01 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        },
    ],
    [
        {  
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4465,
            FirstDate: "2021-04-20 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        }
    ]
]

// GroupedBy object with any random key example
const result2 = { 
    "random1": [
        { 
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4309,
            FirstDate: "2021-05-03 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        },
        {  
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4314,
            FirstDate: "2021-05-03 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        },
    ],
    "random2": [
        {  
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4464,
            FirstDate: "2021-05-01 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        },
    ],
    "random3": [
        {  
            InvDate: "2021-05-04 00:00:00",
            EntityID: 4465,
            FirstDate: "2021-04-20 18:30:00",
            LastDate: "2021-05-04 18:30:00"
        }
    ]
}

它在节点中,不必在 VaniallaJS 中,使用 Lodash 函数就可以了,因为我已经在我的应用程序中安装了它。

借助 lodash groupBy,您可以使用回调(“iteratee”)来创建复合键以同时按两个字段分组。在您的示例中,这很容易,因为所有日期都具有相同的格式,因此您可以简单地连接(添加)它们以创建唯一的复合键。也就是说,

_.groupBy(data, item => item.FirstDate + item.LastDate)

应该做你想做的。

在一般情况下,键可以是任意字符串甚至其他类型,您可以使用JSON将它们组合成一个字符串键,例如:

_.groupBy(data, item => JSON.stringify([item.firstKey, item.secondKey]))