【问题标题】:Javascript Array granulationJavascript数组粒度
【发布时间】:2021-07-15 07:00:44
【问题描述】:

我们有一个长度约为 40K 的数组,这些是无法与外部系统同步的数据。外部系统需要基于 id 的子数组形式的数据,并从主数组本身按创建日期 asc 排序。每个id在源系统中可能有多个故障,"data":{}在主数组的每条记录中都是不同的。

是否有任何库可以有效地实现结果?因为,这必须每天运行。

let customerData = [
{
    "id": 1,
    "data": {},
    "createdDate": ""
},
{
    "id": 1,
    "data": {},
    "createdDate": ""
},
{
    "id": 1,
    "data": {},
    "createdDate": ""
},
{
    "id": 2,
    "data": {},
    "createdDate": ""
},
{
    "id": 2,
    "data": {},
    "createdDate": ""
},
{
    "id": 2,
    "data": {},
    "createdDate": ""
},
{
    "id": 3,
    "data": {},
    "createdDate": ""
},
{
    "id": 4,
    "data": {},
    "createdDate": ""
},
{
    "id": 4,
    "data": {},
    "createdDate": ""
}
];

并且预期的数据应该如下所示被发送到外部系统。

let modifiedData = [
[
    {
        "id": 1,
        "data": {},
        "createdDate": ""
    },
    {
        "id": 1,
        "data": {},
        "createdDate": ""
    },
    {
        "id": 1,
        "data": {},
        "createdDate": ""
    }
],
[
    {
        "id": 2,
        "data": {},
        "createdDate": ""
    },
    {
        "id": 2,
        "data": {},
        "createdDate": ""
    },
    {
        "id": 2,
        "data": {},
        "createdDate": ""
    }
],
[
    {
        "id": 3,
        "data": {},
        "createdDate": ""
    }
],
[
    {
        "id": 4,
        "data": {},
        "createdDate": ""
    },
    {
        "id": 4,
        "data": {},
        "createdDate": ""
    }
]
]

【问题讨论】:

    标签: javascript node.js lodash underscore.js


    【解决方案1】:

    为此,我们可以使用 lodash 函数 _.groupBy。我们按 id 分组,然后使用Object.values 得到数组数组的结果:

    const customerData = [ { "id": 1, "data": {}, "createdDate": "" }, { "id": 1, "data": {}, "createdDate": "" }, { "id": 1, "data": {}, "createdDate": "" }, { "id": 2, "data": {}, "createdDate": "" }, { "id": 2, "data": {}, "createdDate": "" }, { "id": 2, "data": {}, "createdDate": "" }, { "id": 3, "data": {}, "createdDate": "" }, { "id": 4, "data": {}, "createdDate": "" }, { "id": 4, "data": {}, "createdDate": "" } ];
    
    const result = Object.values( _.groupBy(customerData, 'id'));
    console.log("Result:", result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>

    我们也可以通过使用 Array.reduce 的 vanilla JavaScript 执行此操作,创建一个以 id 为键的映射,然后再次使用 Object.values

    const customerData = [ { "id": 1, "data": {}, "createdDate": "" }, { "id": 1, "data": {}, "createdDate": "" }, { "id": 1, "data": {}, "createdDate": "" }, { "id": 2, "data": {}, "createdDate": "" }, { "id": 2, "data": {}, "createdDate": "" }, { "id": 2, "data": {}, "createdDate": "" }, { "id": 3, "data": {}, "createdDate": "" }, { "id": 4, "data": {}, "createdDate": "" }, { "id": 4, "data": {}, "createdDate": "" } ];
    
    const result = Object.values(customerData.reduce((acc, curr) => { 
        if (!acc[curr.id]) acc[curr.id] = [];
        acc[curr.id].push(curr);
        return acc;
    }, {}))
    
    console.log("Result:", result)

    【讨论】:

    • 相同的代码也适用于未修改的下划线。
    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多