如何检查对象数组中是否存在行?

时间:2019-10-02 22:07:30

标签: powershell

我有一个数组

$a = (Invoke-RestMethod -Uri "...." -Method Get) | select X,Y,Z # Object[] Z has type of datetime

$aX, Y, Z

现在我需要检查$a中是否有行

$x,$y,$z = ....
if ($a -contains $x,$y, $x) { ... } # doesn't work

如何做到?

1 个答案:

答案 0 :(得分:1)

听起来您想测试数组$a是否包含一个对象,该对象具有给定的一组给定的属性值($x$y$z)属性名称集(.X.Y.Z):

$hasObjectWithValues = [bool] $(foreach ($o in $a) {
    if ($o.X -eq $x -and $o.Y -eq $y -and $o.Z -eq $z) {
      $true
      break
    }
  })

注意:简洁的[bool] $hasObjectWithValues = foreach ... 格式可以工作,但是从PowerShell Core 7.0.0-preview.4开始,由于{{3} }


关于您尝试过的事情

  

$a -contains $x,$y, $z

PowerShell this bug的RHS仅支持标量(单个值),该值将被测试是否与数组值LHS中的元素相等。

但是,即使将RHS封装到单个对象-[pscustomobject] @{ X = $x, Y = $y, Z = $z }中,该方法也不起作用,因为[pscustomobject]Invoke-RestMethod返回的A[t, vec]<- 0.5 * Matrix::rowSums(cbind(A[vec,fam[t,"dad"]],A[vec,fam[t,"mum"]]), na.rm=T) s是引用类型,在没有自定义相等比较行为的情况下,将通过引用相等进行比较,这意味着它们仅在引用非常相同时才被视为相等内存中的对象