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

如何用PowerShell的ForEach()按首元素年份汇总多维数组次元素?

按年份汇总多维数组数值的最优PowerShell实现

嗨,这个需求用PowerShell的原生cmdlet组合就能高效搞定,比纯手写循环简洁还不容易出错!咱们先从最直观的最优方案说起,再补充原理级的手动实现供你参考。

方案一:用Group-Object+Measure-Object(推荐,最优)

首先假设你的多维数组结构是这样的(每个子数组第一个元素是年份,第二个是要汇总的数值):

# 模拟你的多维数组
$multiArray = @(
    @(2022, 100),
    @(2023, 200),
    @(2022, 150),
    @(2023, 300),
    @(2024, 50)
)

接下来用分组+求和的组合实现汇总:

$yearlySummary = $multiArray | 
    # 按子数组的第一个元素(年份)分组
    Group-Object -Property { $_[0] } | 
    # 对每组的数值求和,输出结构化对象
    ForEach-Object {
        [PSCustomObject]@{
            Year  = $_.Name  # 分组的年份
            Total = ($_.Group | Measure-Object -Property { $_[1] } -Sum).Sum  # 该年份的数值总和
        }
    }

# 查看结果
$yearlySummary

为什么这是最优方案?

  • Group-Object是PowerShell专门优化过的分组工具,比手动遍历维护数据结构效率更高
  • 代码简洁易读,逻辑清晰,不需要自己处理分组判断和累加的细节
  • 输出的PSCustomObject是结构化数据,方便后续排序、导出CSV或者格式化展示

方案二:手动用哈希表实现(适合理解原理)

如果你想更清楚底层逻辑,或者需要自定义更复杂的处理逻辑,可以用哈希表来手动累加:

# 初始化一个空哈希表存储年份和对应总和
$sumDictionary = @{}

# 遍历多维数组
foreach ($item in $multiArray) {
    $currentYear = $item[0]
    $currentValue = $item[1]

    # 判断年份是否已存在,存在则累加,不存在则初始化
    if ($sumDictionary.ContainsKey($currentYear)) {
        $sumDictionary[$currentYear] += $currentValue
    } else {
        $sumDictionary[$currentYear] = $currentValue
    }
}

# 把哈希表转换成结构化对象输出(和方案一格式一致)
$yearlySummary = $sumDictionary.GetEnumerator() | ForEach-Object {
    [PSCustomObject]@{
        Year  = $_.Key
        Total = $_.Value
    }
}

$yearlySummary

这个方案的适用场景

当你需要在累加过程中添加额外逻辑(比如数值过滤、特殊年份处理)时,手动遍历哈希表的方式会更灵活。

内容的提问来源于stack exchange,提问作者Bjørn H. Sandvik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:37:04