检测空对象数组

Posted

技术标签:

【中文标题】检测空对象数组【英文标题】:Detect an array of empty objects 【发布时间】:2019-01-28 18:39:14 【问题描述】:

我正在调用此处记录的 VSTS 拉取请求查询:https://docs.microsoft.com/en-us/rest/api/vsts/git/pull%20request%20query/get?view=vsts-rest-4.1

它返回一个结果对象数组。我想检测什么时候没有返回结果并做出相应的反应。我以为我可以检查response.results.length,但即使没有结果也会是1。它返回一个包含 1 个空对象的数组。我很难检测到这种情况。我想到的一个解决方案是:

if(($pullRequests.results | Get-Member -MemberType Properties).Length -eq 0)一些代码

因为一个普通的 ps 对象有 4 个成员,并且填充的对象有一个额外的 note 属性,所以它可以工作。我的方法看起来很hackish,有没有更好的方法?

我尝试检查长度、存在和布尔:

PS> $pullRequests.results[0].Length 1 PS> $temp = $pullRequests.results[0] PS> $临时|获取会员 类型名称:System.Management.Automation.PSCustomObject 名称 MemberType 定义 ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode 方法 int GetHashCode() GetType 方法类型 GetType() ToString 方法字符串 ToS​​tring() PS> $temp -eq $null 错误的 PS> if($temp)"YAY"else"BOO" 耶

【问题讨论】:

这实际上听起来像是 API 中的一个错误——空数组不是空对象。你怎么得到$pullRequests -- 和Invoke-RestMethod?尝试Invoke-WebRequest 以查看它实际返回的内容以及是否可以在将其传递给ConvertFrom-Json 之前对其进行按摩。 (这也表明反过来应该是可能的——检查($pullRequests.results[0] | ConvertTo-Json -Compress) -eq ""。虽然这仍然有点老套和低效。) 如果我使用 webRequest 响应内容包含:"results":[] 响应一个“未电镀”对象的数组 那么我会检查您收到的回复是否为[]| ConvertFrom-Json 否则。 根据文档,“列表中的每个条目都是提交->拉取请求的字典。”所以从技术上讲,如果您向它提供一个查询,则返回一个空字典是正确的。如果提供了多个查询,则每个查询都可能为空。要查看单个结果是否为空,最干净的方法可能是if ($result | Get-Member -Type Properties) 【参考方案1】:

这听起来确实像 API 中的错误。作为一种解决方法,检查 properties(相对于也包括方法的 members)似乎是正确的方法。最简单的方法如下:

if ($pullRequests.PSObject.Properties)

    "Object has properties so process it."

else

    "Object has no properties, ignore it."

【讨论】:

看起来这个对象有一些默认属性: PS>$pullRequests.results.PSObject.Properties |选择名称 Name ---- Count Length LongLength Rank SyncRoot IsReadOnly IsFixedSize IsSynchronized 阅读问题,我认为应该是$pullRequests.results[0].PSObject.Properties$Temp.PSObject.Properties。此解决方案的问题可能是,如果根本没有 .results,您将收到 Cannot index into a null array 错误。 这可能是最接近我确定的答案。我必须将属性包装在一个数组中: if (@($pullRequests.results[0].PSObject.Properties).Count -eq 0) 【参考方案2】:

天哪,太臭了。

请确保我了解您的问题。返回数据时,您期望的对象如下所示:

$full_collection_ps_objects = `
    @([PSCustomObject]@a=1;b=2, [PSCustomObject]@a=1;b=3)

psobjects 的集合。

当没有数据返回时,你会得到一个带有单个空 psobject 的对象数组:

$empty_collection_ps_objects = @([PSCustomObject]@)

我认为你成功了。物业数量是一个很好的指标。我有点神经质。这可能会导致我偏执于另一个默认属性可能会在稍后出现。我可能会考虑寻找特定的字段名称,主键类似于:

if( $($empty_collection_ps_objects | Get-Member).Name -contains 'a' )  $true 
if( $($full_collection_ps_objects | Get-Member).Name -contains 'a' )  $true 

【讨论】:

这种方法的一个挑战。返回的属性是一个我不会提前知道的 guid。 guid 是值还是列?您正在从 VSTS 获取提交哈希。我原以为提交哈希会在名为“commit”或类似名称的字段中返回。 列。运行这个:“($pullRequests.results | get-member).Name”返回:“Equals GetHashCode GetType ToString x7f98xxx40d5exxx0f4xxxe04xxx8c8xxxe19xxx” 我添加了一些 x,因为我们对任何类型的识别数据都有点疯狂:) 明白了。不,那我明白你的意思了。这不适用于您的用例。我假设列名是静态的并且是已知的。

以上是关于检测空对象数组的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript之检测数组或对象是否存在空值toLowerCasecallslicesplitstringifyindexOfprototypetoString

JavaScript之检测数组或对象是否存在空值toLowerCasecallslicesplitstringifyindexOfprototypetoString

js过滤数组中都为空的对象几种方式

2021-04-09【技术】关于空数组和空对象为true的问题

具有对象元素的嵌套数组模式返回具有空对象的数组

js删除对象/数组中nullundefined空对象及空数组方法示例