Javascript 数组粒度

问题描述

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

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

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

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

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

解决方法

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

const customerData = [ { "id": 1,"data": {},"createdDate": "" },{ "id": 1,{ "id": 2,{ "id": 3,{ "id": 4,"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,"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)