You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组中相似的PSObject合并为单个对象并保留原属性?

合并分页API返回的相似PSObject集合

问题说明

我有一个来自分页API查询的PowerShell数组$events,数组中的每一项对应一个查询页面,示例输出如下:

PS C:\Test\$events

total events
----- ------                                                                                                                                                                                                                                              
  867 @{category_id=1; content_ver=Version: 2022-10-26 rev. 008; Sequence: 221026008; count=1; cybox=; device_end_time=1666837251000; device_ip=X.X.X.X; device_location=; device_time=1666837251000; feature_name=MALWARE_PROTECTION; feature_ui… 
  867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 
  867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 
  867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 
  867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 

每个页面的events属性下的PSObject结构完全一致,需要将所有页面的events对象合并为一个统一集合,同时保留原有全部属性。

解决方法

方法1:直接利用成员枚举(最简便)

PowerShell的成员枚举特性会自动遍历集合中每个元素的指定属性,并将结果合并为一个数组:

$mergedEvents = $events.events

方法2:使用Select-Object展开属性

如果需要更明确的操作逻辑,用-ExpandProperty参数直接提取并展开每个元素的events属性:

$mergedEvents = $events | Select-Object -ExpandProperty events

方法3:遍历收集(支持自定义处理)

如果合并过程中需要添加过滤、转换等自定义逻辑,用ForEach-Object遍历处理:

# 基础写法(数据量小时适用)
$mergedEvents = @()
$events | ForEach-Object {
    $mergedEvents += $_.events
    # 可在此添加自定义逻辑,比如过滤特定category_id的对象
    # $mergedEvents += $_.events | Where-Object { $_.category_id -eq 1 }
}

# 大数据量优化写法(避免数组扩容性能损耗)
$mergedEvents = New-Object System.Collections.ArrayList
$events | ForEach-Object {
    [void]$mergedEvents.AddRange($_.events)
}

验证结果

合并完成后,可通过以下命令确认结果:

# 查看合并后的总对象数
$mergedEvents.Count

# 查看对象的属性结构(确保属性完整保留)
$mergedEvents[0] | Get-Member -MemberType NoteProperty

内容的提问来源于stack exchange,提问作者Douda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:30