以下代码定义了一个矩阵。
$a = @('a','b','x',10),
@('a','b','y',20),
@('c','e','x',50),
@('c','e','y',30)
$a | % { "[$_]"}
我希望按x
和y
来转动数组。预期的结果数组应该是
[a b 10 20] [c e 50 30] - - -- -- x y
我认为它需要group-object
然后映射。如何在数组上使用group-object
?
(顺便说一下,为什么这个问题已被投票两次?)
答案 0 :(得分:1)
由于Group-Object适用于对象属性,因此无法将Group-Object
与数组一起使用(至少不是您想要的方式)。解决方法是将行组织到要分组的标签中,然后是要分配给组的值。然后你可以在标签上分组:
$a | %{
new-object PsObject -prop @{"label" = "$($_[0]),$($_[1])"; value=@{ $_[2]=$_[3]}}
} | Group-Object label
所以,那么你有一个组,你的条目被作为每个组中的一个哈希表数组进行stroed:
Count Name Group
----- ---- -----
2 a,b {@{value=System.Collections.Hashtable; label=a,b}, @{value=System.Collections.Hashtable; label=a,b}}
2 c,e {@{value=System.Collections.Hashtable; label=c,e}, @{value=System.Collections.Hashtable; label=c,e}}
然后,您可以展开每一行以获得所需的信息:
$a | %{
new-object PsObject -prop @{"label" = "$($_[0]),$($_[1])"; value=@{ $_[2]=$_[3]}}
} |
group label | % {
"[$(@($_.Name -split ",") + @($_.Group.value.values))]"
}
给出:
[a b 10 20]
[c e 50 30]
要回答您的第二条评论,以上没有赢得; t保证订单。为了保证它,你必须明确:
$a | %{
new-object PsObject -prop @{"label" = "$($_[0]),$($_[1])"; value=@{ $_[2]=$_[3]}}
} |
group label | % {
"[$(@($_.Name -split ",") + @($_.Group.value.x, $_.Group.value.y))]"
}