【问题标题】:Javascript - Grouping and filtering a list of listsJavascript - 对列表进行分组和过滤
【发布时间】:2022-06-20 11:28:25
【问题描述】:

我有一个值events,它是一个列表列表,其地图如下所示:

[
    [
        {
            "packageId": "2721",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 831,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        }
    ],
    [
        {
            "packageId": "2738",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 832,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        }
    ],
    [
        {
            "packageId": "2721",
            "eventTime": "2022-03-20T16:25:00Z",
            "type": "deviated-manually-overridden",
            "id": 842,
            "createdAt": "2022-03-20T16:26:00.363630Z",
            "createdBy": "47"
        },
        {
            "packageId": "2721",
            "eventTime": "2022-03-20T16:38:00Z",
            "type": "deviated-manually-overridden",
            "id": 844,
            "createdAt": "2022-03-20T16:38:46.352751Z",
            "createdBy": "47"
        },
        {
            "packageId": "2721",
            "eventTime": "2022-03-20T20:31:00Z",
            "type": "collected-manually-overridden",
            "id": 846,
            "createdAt": "2022-03-20T20:32:18.046346Z",
            "createdBy": "47"
        },
        {
            "packageId": "2721",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 829,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        }
    ],
    [
        {
            "packageId": "2738",
            "eventTime": "2022-03-20T16:25:00Z",
            "type": "deviated-manually-overridden",
            "id": 843,
            "createdAt": "2022-03-20T16:26:00.363630Z",
            "createdBy": "47"
        },
        {
            "packageId": "2738",
            "eventTime": "2022-03-20T16:38:00Z",
            "type": "deviated-manually-overridden",
            "id": 845,
            "createdAt": "2022-03-20T16:38:46.352751Z",
            "createdBy": "47"
        },
        {
            "packageId": "2738",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 830,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        }
    ],
    [
        {
            "packageId": "2721",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 833,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        }
    ],
    [
        {
            "packageId": "2738",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 834,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        }
    ]
]

我想通过地图的packageId 将这个列表分组到一个列表中,这样每个具有相同packageId 的地图都是一个列表的一部分。同时,我还想过滤掉具有相同packageIdtypeeventTime 的映射,这样我就只有一个具有相同字段值的映射。 我想要实现的是:

[
    [
        {
            "packageId": "2721",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 831,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        },
        {
            "packageId": "2721",
            "eventTime": "2022-03-20T16:25:00Z",
            "type": "deviated-manually-overridden",
            "id": 842,
            "createdAt": "2022-03-20T16:26:00.363630Z",
            "createdBy": "47"
        },
        {
            "packageId": "2721",
            "eventTime": "2022-03-20T16:38:00Z",
            "type": "deviated-manually-overridden",
            "id": 844,
            "createdAt": "2022-03-20T16:38:46.352751Z",
            "createdBy": "47"
        },
        {
            "packageId": "2721",
            "eventTime": "2022-03-20T20:31:00Z",
            "type": "collected-manually-overridden",
            "id": 846,
            "createdAt": "2022-03-20T20:32:18.046346Z",
            "createdBy": "47"
        }
    ],
    [
        {
            "packageId": "2738",
            "eventTime": "2022-03-15T11:24:12.200864Z",
            "type": "created",
            "id": 832,
            "createdAt": "2022-03-15T11:24:12.200864Z",
            "createdBy": "47"
        },
        {
            "packageId": "2738",
            "eventTime": "2022-03-20T16:25:00Z",
            "type": "deviated-manually-overridden",
            "id": 843,
            "createdAt": "2022-03-20T16:26:00.363630Z",
            "createdBy": "47"
        },
        {
            "packageId": "2738",
            "eventTime": "2022-03-20T16:38:00Z",
            "type": "deviated-manually-overridden",
            "id": 845,
            "createdAt": "2022-03-20T16:38:46.352751Z",
            "createdBy": "47"
        }
    ]
]

我不确定如何使用groupByfilter 实现这种数据结构。我试过了:

events.groupBy(listOfEvents => listOfEvents.map(e => e.get('packageId')))

但是,这显然行不通。我该怎么做?

更新

我已尝试根据答案建议创建地图:

const grouped = Map<string, List<Event>>()
  events.map(list => list.map(event => {
    const packageId = event?.get('packageId')
    console.log('packageId ', packageId)
    if (packageId) {
      console.log('grouped packageId: ', grouped.get(packageId))
      if (!grouped.get(packageId)) {
        grouped.set(packageId, List<Event>())
      }
      const updatedList = grouped.get(packageId)?.push(event)
      console.log('updatedList: ', updatedList)
      if (updatedList) grouped.set(packageId, updatedList)
      console.log('grouped: ', grouped)
    }
  }))

  console.log('grouped ', grouped)

但是,这并没有在 Map 中设置任何值,我看到 packageId 已记录,但其他所有内容都是 undefinedgrouped 的大小为 0。我在这里做错了什么?

【问题讨论】:

    标签: javascript typescript immutable.js


    【解决方案1】:

    一种方法是使用packageId 作为键将所有内容传输到一个对象中,在此过程中,根据packageIdtypeeventTime 为每个对象生成一个id,如果是@,则忽略它987654326@ 已经被转移,然后将其值提取到数组中:

    const data = [
        [
            {
                "packageId": "2721",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 831,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2738",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 832,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2721",
                "eventTime": "2022-03-20T16:25:00Z",
                "type": "deviated-manually-overridden",
                "id": 842,
                "createdAt": "2022-03-20T16:26:00.363630Z",
                "createdBy": "47"
            },
            {
                "packageId": "2721",
                "eventTime": "2022-03-20T16:38:00Z",
                "type": "deviated-manually-overridden",
                "id": 844,
                "createdAt": "2022-03-20T16:38:46.352751Z",
                "createdBy": "47"
            },
            {
                "packageId": "2721",
                "eventTime": "2022-03-20T20:31:00Z",
                "type": "collected-manually-overridden",
                "id": 846,
                "createdAt": "2022-03-20T20:32:18.046346Z",
                "createdBy": "47"
            },
            {
                "packageId": "2721",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 829,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2738",
                "eventTime": "2022-03-20T16:25:00Z",
                "type": "deviated-manually-overridden",
                "id": 843,
                "createdAt": "2022-03-20T16:26:00.363630Z",
                "createdBy": "47"
            },
            {
                "packageId": "2738",
                "eventTime": "2022-03-20T16:38:00Z",
                "type": "deviated-manually-overridden",
                "id": 845,
                "createdAt": "2022-03-20T16:38:46.352751Z",
                "createdBy": "47"
            },
            {
                "packageId": "2738",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 830,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2721",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 833,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2738",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 834,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ]
    ];
    let groups = {};
    for(let i = 0, filter = {}; i < data.length; i++)
    {
      for(let j = 0; j < data[i].length; j++)
      {
        const d = data[i][j],
              id = d.packageId+"_"+d.type+"_"+d.eventTime;
    
        if (id in filter)
          continue;
    
        filter[id] = "";
        if (!groups[d.packageId])
          groups[d.packageId] = [];
    
        groups[d.packageId].push(d);
      }
    }
    
    groups = Object.values(groups);
    console.log(groups);

    附: 这可以通过使用Array.map() 而不是for 循环在视觉上简化,但会稍微慢一些。

    【讨论】:

    • 我正在尝试将其转换为不可变的数据结构,例如,您将如何使用 Map 来做到这一点?
    【解决方案2】:

    试试这个

    var grouped = {};
    var lists = [
        [
            {
                "packageId": "2721",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 831,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2738",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 832,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2721",
                "eventTime": "2022-03-20T16:25:00Z",
                "type": "deviated-manually-overridden",
                "id": 842,
                "createdAt": "2022-03-20T16:26:00.363630Z",
                "createdBy": "47"
            },
            {
                "packageId": "2721",
                "eventTime": "2022-03-20T16:38:00Z",
                "type": "deviated-manually-overridden",
                "id": 844,
                "createdAt": "2022-03-20T16:38:46.352751Z",
                "createdBy": "47"
            },
            {
                "packageId": "2721",
                "eventTime": "2022-03-20T20:31:00Z",
                "type": "collected-manually-overridden",
                "id": 846,
                "createdAt": "2022-03-20T20:32:18.046346Z",
                "createdBy": "47"
            },
            {
                "packageId": "2721",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 829,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2738",
                "eventTime": "2022-03-20T16:25:00Z",
                "type": "deviated-manually-overridden",
                "id": 843,
                "createdAt": "2022-03-20T16:26:00.363630Z",
                "createdBy": "47"
            },
            {
                "packageId": "2738",
                "eventTime": "2022-03-20T16:38:00Z",
                "type": "deviated-manually-overridden",
                "id": 845,
                "createdAt": "2022-03-20T16:38:46.352751Z",
                "createdBy": "47"
            },
            {
                "packageId": "2738",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 830,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2721",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 833,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ],
        [
            {
                "packageId": "2738",
                "eventTime": "2022-03-15T11:24:12.200864Z",
                "type": "created",
                "id": 834,
                "createdAt": "2022-03-15T11:24:12.200864Z",
                "createdBy": "47"
            }
        ]
    ]
    
    lists.map(list=>list.map(byPack=> {
       if (!grouped[byPack.packageId]){
           grouped[byPack.packageId]=[];
        }
    
        grouped[byPack.packageId].push(byPack);
    }));
    
    console.log(grouped);

    【讨论】:

    • 我已经更新了我的问题,努力用不可变的 Map 翻译这段代码,但我无法让它工作。您将如何使用不可变的 Map 来做到这一点?
    • lists.map... 块末尾缺少右括号
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多