Powershell:哈希表的联合列表-在发生冲突时获取最新列表

Powershell:哈希表的联合列表-在发生冲突时获取最新列表,powershell,hashtable,Powershell,Hashtable,我目前正在尝试合并一个N个哈希表的列表,其中每个表都包含一个时间戳和另一个哈希表列表 其思想是合并哈希表列表,并对来自具有最高时间戳的表的一行进行冲突处理 例如: @( @{ week = '2020-05' participants = @( @{ name = 'user A' age = 35 address = 'city A'

我目前正在尝试合并一个N个哈希表的列表,其中每个表都包含一个时间戳和另一个哈希表列表

其思想是合并哈希表列表,并对来自具有最高时间戳的表的一行进行冲突处理

例如:

@(
    @{
       week = '2020-05'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city B'
           }
       )
    },@{
       week = '2020-04'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city A'
           },
           @{
               name = 'user C'
               age = 42
               address = 'city B'
           }
       )
    }
)
请注意,对于口译,在2020-05年,我们收到了2个用户,而在2020-04年,我们收到了3个用户

现在,最终目标是得到如下列表:

result = @(
    @{
        week = '2020-05'
        name = 'user A'
        age = 35
        address = 'city A'
    },
    @{
        week = '2020-05'
        name = 'user B'
        age = 16
        address = 'city B'
    },
    @{
        week = '2020-04'
        name = 'user C'
        age = 42
        address = 'city B'
    }
)

我现在的问题是:不必使用显式循环,但使用foreach或select对象,就可以解决这个问题吗?我已经能够使用select object/distinct获得一个唯一用户名数组,但这里我感兴趣的不仅是可能的名称列表,还有姓名/年龄和地址的组合。

将其放在这里,因为它有代码,因此注释部分太长

但是。。。但是,“用户b”在两周内,但地址不同。在正常思维中,他们是两个不同的人,因为他们的住所在两个不同的地方。因此,如果是这样的话,你所追求的最终结果是无效的

Clear-Host

@(
    @{
       week = '2020-05'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city B'
           }
       )
    },@{
       week = '2020-04'
       participants = @(
           @{
               name = 'user A'
               age = 35
               address = 'city A'
           },
           @{
               name = 'user B'
               age = 16
               address = 'city A'
           },
           @{
               name = 'user C'
               age = 42
               address = 'city B'
           }
       )
    }
) | 
ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants

# Results
<#
name   age address week   
----   --- ------- ----   
user A  35 city A  2020-05
user B  16 city B  2020-05
user A  35 city A  2020-04
user B  16 city A  2020-04
user C  42 city B  2020-04
#>
使用Select-Unique

ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Select -Unique Name, age, address

# Results
<#
name   age address
----   --- -------
user A  35 city A 
user B  16 city B 
user B  16 city A 
user C  42 city B
#>
当然,放弃这座城市会让你得到你想要的三个,好吧,我只是在这里显示你的名字和年龄。如果用户名不能绝对保证是唯一的,那么,好吧,你知道

ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Select -Unique Name, age

# Results
<#
name   age
----   ---
user A  35
user B  16
user C  42
#>
现在,在转换回has表之前,将地址和星期返回到列表中是另一回事,因为这在最终的Select语句中不可用

最后,如果可以得到所需的结果,那么不使用循环的原因是什么?从我迄今为止的实验来看,这是一件简单得多的事情,与我迄今为止的尝试和我在这里发布的内容相比

更新

好吧,我想这是给你的。我真的不知道为什么在我最初的帖子中我没有想到,尤其是当使用组对象给了我第一个线索时

# Convert JSON and use Sort unique to work with data
Clear-Host
$HasheTableExport | 
ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Sort-Object -Property name -Unique

<#
# Results

name   age address week   
----   --- ------- ----   
user A  35 city A  2020-05
user B  16 city B  2020-05
user C  42 city B  2020-04
#>

# View as JSON
Clear-Host
$HasheTableExport | 
ConvertTo-Json -Depth 3 | 
ConvertFrom-Json | 
Select -ExpandProperty SyncRoot | 
Select Week -ExpandProperty participants | 
Sort-Object -Property name -Unique | 
ConvertTo-Json

# Results
<#
[
    {
        "name":  "user A",
        "age":  35,
        "address":  "city A",
        "week":  "2020-05"
    },
    {
        "name":  "user B",
        "age":  16,
        "address":  "city B",
        "week":  "2020-05"
    },
    {
        "name":  "user C",
        "age":  42,
        "address":  "city B",
        "week":  "2020-04"
    }
]
#>

然后根据需要利用/转换。

感谢您的快速回复。给你一个简单的背景:我要求提供另一种解决方案,因为我认为它可能更有效,因为它可以利用Powershell的内置功能。关于名称:试着将其视为我们每天收到的数据的主键——而更改地址仅仅意味着,从一周到下一周都有更新。因此,我们希望有一个所有用户在所有星期的名单-与最新的数据,我们为他们有,但感谢你的答复-这已经帮助了很多-现在我只需要找出如何检索最新的行,如果有重复的名字没有担心。由于用例的普遍兴趣,我仍在研究它,看看我是否能完全解决它。如果你这样做了,在其他人之前,一定要更新,让所有人都从中受益。