【问题标题】:Return an array of unique objects which are specified by properties using PowerShell使用 PowerShell 返回由属性指定的唯一对象数组
【发布时间】:2022-01-25 05:01:22
【问题描述】:

我有一个从 JSON 转换而来的对象,其中包含有关“受信任的客户”的信息。有两个属性,其中一个标识客户端的唯一性:Name AND Thumbprint,所以如果有元素,要么包含相同的NameThumbprint,它们必须是省略。

另外,我想指出,输出数组应该包含附加属性 - Id,可以使用 - New-Guid 生成。此处讨论了该特殊情况:enter link description here

{
  "TrustedClients": [
        {
            "Name": "Client1",
            "Thumbprint": "5ed7eb688e404bd787585637975ddb01",
            "CallbackThumbprint": "b7f610106fa24afe9460ab8e4f2db1fc"
        },
        {
            "Name": "Client2",
            "Thumbprint": "5ed7eb688e404bd787585637975ddb01",
            "CallbackThumbprint": "b7f610106fa24afe9460ab8e4f2db1fc"
        },
        {
            "Name": "Client3",
            "Thumbprint": "1700a8497495d6053be04b690b98479fd62e6cc9",
            "CallbackThumbprint": "b7f610106fa24afe9460ab8e4f2db1fc"
        }
    ]
}

有没有一种有效的方法来获取由Name AND Thumbprint 属性指定的唯一对象数组?所以在这种情况下,输出数组应该只包含一个名为 Client3 的对象,因为有两个元素具有相同的 Thumbprint 值:

{
  "TrustedClients": [
        {
            "Id": "{(New-Guid).ToString()}"
            "Name": "Client3",
            "Thumbprint": "1700a8497495d6053be04b690b98479fd62e6cc9",
            "CallbackThumbprint": "b7f610106fa24afe9460ab8e4f2db1fc"
        }
    ]
}

一开始我在用 grouping 进行调整,但它与基本思想相冲突 - Name AND Thumbprint 的唯一性。很明显,通过Name AND Thumbprint 分组 元素可能会返回具有不同Name 值的数组,但相同的Thumbprint 值,反之亦然。

【问题讨论】:

  • “很明显,按名称和指纹对元素进行分组可能会返回具有不同名称值的数组,但相同的指纹,反之亦然。” - 我看不出这是多么明显。 $jsonObject.TrustedClients |Group-Object Name,Thumbprint 是否将具有不同 Name 值的对象组合在一起?如果是这样,那就是一个错误
  • 可能我错过了什么,但$jsonObject.TrustedClients |Group-Object Name,Thumbprint 返回相同的数组。对我来说很明显,当通过指定 keys 对某些内容进行分组时,keys 本身的 values 必须是唯一的。在这种特殊情况下,由于有两个相同的Thumbprint 和相同的Name,因此分组返回两个不同的对象,它们具有不同的Names 但相同的Thumbprint
  • 您是否忘记发布(部分)输入数据?您发布的 JSON 中没有两个具有相同 Name 属性的对象。
  • 对不起,我明白你的意思,我相信。 “很明显,按名称和指纹对元素进行分组可能会返回具有不同名称值的数组”:当然,这不是获得唯一对象集合的方法。我的意思是,在这种情况下,通过NameThumbprint 分组 是获得所需结果的错误方法。所以我想要的是获得一个唯一的对象数组,其中 NameThumbprint 值不会在数组的任何对象中重复
  • 根据您显示的数据,那么在Thumbprint 上分组还不够吗?您想如何处理冲突的名称?合并前两个条目的结果(基于它们的共同指纹值5ed7eb688e404bd787585637975ddb01)是否应该具有Name“Client1”或“Client2”(或其他完全)?

标签: json powershell duplicates


【解决方案1】:

我在它周围看到的方式是Group-Object 2 次,在NameThumbprint 上,以获取那些重复的对象,一旦我们有了这些信息,我们就可以通过过滤@987654325 来跳过它们@。

为了提高效率,我在这种情况下使用-NoElement

因为我是一个完全没有课程的菜鸟,所以我决定制作一个用于练习目的:)

class UniqueJSON {
    [object[]]$Items

    UniqueJSON ([pscustomobject[]]$In) {
        $this.Items = $In
        $this.SetGuid()
    }

    [void]SetGuid () {
        $this.Items.Where({ -not $_.ID }).ForEach({
            $_.PSObject.Properties.Add([psnoteproperty]::new(
                    'ID', [guid]::NewGuid().Guid
                )
            )
        })
    }

    [object[]]GetUnique() {
        $thumbNotShow = $this.Items | Group-Object Thumbprint -NoElement |
        Where-Object Count -GT 1
        $nameNotShow = $this.Items | Group-Object Name -NoElement |
        Where-Object Count -GT 1

        return $this.Items.Where({
            $_.Name -notin $nameNotShow.Name -and
            $_.Thumbprint -notin $thumbNotShow.Name
        })
    }
}

# Here you can import your JSON
$json = ..... | ConvertFrom-Json

# Now store the TrustedClients property in a variable
$trusted = $json.TrustedClients

# Create a new instance of the class
$instance = [UniqueJSON]$trusted

# Get the unique results
$instance.GetUnique()
  • $instance.GetUnique() 回复:
Name    Thumbprint                               CallbackThumbprint               ID
----    ----------                               ------------------               --
Client3 1700a8497495d6053be04b690b98479fd62e6cc9 b7f610106fa24afe9460ab8e4f2db1fc 85af5623-365c-4f8a-9863-be38860406da

【讨论】:

  • 谢谢,Thumbprint 键的好技巧。一般来说,只要对代码进行微小的更改,它就对我有用。
  • @yemo 我已经更新了这个答案,我之前提供的代码在某些情况下会失败
猜你喜欢
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2021-01-12
相关资源
最近更新 更多