【问题标题】:groupBy array based on combination of 2 propertiesgroupBy 数组基于 2 个属性的组合
【发布时间】:2021-07-27 22:58:20
【问题描述】:

我想根据 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 功能可以工作,因为我已经在我的应用程序中安装了它。

【问题讨论】:

  • for lodash lodash.com/docs/4.17.15#groupBy 可能会派上用场
  • @georg 是的,通过使用它,我可以使用 LastDate 这样的单个键进行分组,但我不确定如何使用组合键进行分组
  • 在这种特殊情况下,您可以简单地连接它们:_.groupBy(data, x => x.FirstDate + x.LastDate)
  • 这确实有效@georg,我还将用我的确切数据进行测试,您能否在 cmets 或答案中解释,将它们连接起来如何对它们进行分组,以供我和整个堆栈观众将来参考。
  • 我几乎明白它在做什么,但如果你能解释一下,那将不胜感激。谢谢

标签: javascript node.js arrays lodash


【解决方案1】:

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

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

应该做你想做的。

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

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

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2017-06-02
    相关资源
    最近更新 更多