【问题标题】:Expanding an array in an object?扩展对象中的数组?
【发布时间】:2019-10-16 20:56:06
【问题描述】:

我正在使用网络请求来查询我的电话系统以获取用户列表及其队列关联。生成的数据被放入一个对象并最终输出到屏幕和 CSV。问题是许多用户是多个队列的成员,并且生成的队列成员数据作为数组返回。

这就是我的输出的样子:

名字 姓氏 扩展技能 组 技能水平 ---------- --------- --------- ------------ ----------- Kylo Ren 1234 {销售支持、客户服务} {8, 8} Flip Zimmerman 4321 {会计、营销} {5, 3} Clyde Logan 1122 {销售支持、客户服务} {4、9} Ronnie Peterson 2211 {销售支持、客户服务、索赔} {4, 9, 1} 亚当萨克勒 1212 工程 2

如您所见,“技能组”和“技能级别”列表示为数组,而保存的 CSV 中的单元格只有 System.Object[],这显然只是表示该单元格包含一个数组。但是,如果用户只是一个技能组的成员,则返回的数据将是一个普通字符串,如上面列表中的 Adam Sackler。

我正在苦苦挣扎的一件事是我不知道应该如何显示数据?各位好心人的一些建议将不胜感激。

例如,我应该为每个技能组和相关技能级别动态创建列吗?当用户的列数少于或多于已有的列数时会发生什么?

名 姓 扩展名 技能组 1 技能等级 1 技能组 2 技能等级 2 ---------- --------- --------- ------------- --------- ---- ------------- ------------- Kylo Ren 1234 销售支持 8 客户服务 8 Flip Zimmerman 4321 会计 5 营销 3

或者每个额外的技能组和技能水平应该在一个新的线上?额外的技能组/级别应该在单独的行中还是只在单元格中使用回车?

名字 姓氏 扩展技能 组 技能水平 ---------- --------- --------- ------------ ----------- Kylo Ren 1234 销售支持 8 客户服务 4 翻转齐默尔曼 4321 会计 5 营销 3

无论如何,以下是使用数组创建对象的相关代码:

[xml]$resourceCsqInfo = Invoke-WebRequest -Uri $uccxServerBaseUrl"resource?csqid="$($csq.id) -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

[object]$data = $resourceCsqInfo.resources.resource

foreach ($resource in $data) {
    $outputList += New-Object -TypeName PSObject -Property @{
        "First Name"  = $resource.firstName;
        "Last Name"   = $resource.lastName;
        "Extension"   = $resource.extension;
        "Skill Group" = $resource.skillmap.skillcompetency.skillNameUriPair.name;
        "Skill Level" = $resource.skillmap.skillcompetency.competencelevel
    }
}

变量$resource.skillmap.skillcompetency.skillNameUriPair.name$resource.skillmap.skillcompetency.competencelevel 是循环中的相关项。

所以我的问题是这样的;如何扩展对象中的数组以及传达附加信息的最佳方式是什么?

【问题讨论】:

  • 看看learn-powershell.net/2014/01/24/…“Out-String and Trim()”部分将是我的解决方案。
  • 将包含集合的属性放入列的一种方法是使用$Collection -join ';'。这将使您将属性中的项目转换为分号分隔的字符串。

标签: powershell


【解决方案1】:

传达额外信息的最佳方式将完全取决于谁或什么在使用它。为人类格式化输出与按摩输出以进行进一步的程序分析或操作不同。

通常,第一个示例中的动态列选项仅适用于可能的列数非常少的情况。即便如此,以编程方式使用和视觉理解仍然有点混乱。

第二个选项是您已有的输出的更易于阅读的版本。但是让它看起来像这样的方法基本上会把它变成纯文本,你不能做任何进一步的工作。

我的首选选项通常是第二个选项的变体。不要试图从后续技能行中省略名称/扩展数据,只需复制它即可。因此,Kylo 最初的两个技能条目变成了两个不同的 Kylo 条目,每个条目都有不同的技能。这在数据库世界中称为非规范化。

在您的 foreach 循环中,您将有一个子循环迭代技能集合,然后为每个技能输出一个对象,而不仅仅是为个人$resource 输出一个对象。所以也许是这样的:

foreach ($resource in $data) {
    for ($i=0; $i -lt @($resource.skillmap.skillcompetency.skillNameUriPair).Count; $i++) {
        [pscustomobject]@{
            'First Name' = $resource.firstName
            'Last Name' = $resource.lastName
            'Extension' = $resource.extension
            'Skill Group' = $resource.skillmap.skillcompetency.skillNameUriPair[$i].name
            'Skill Level' = $resource.skillmap.skillcompetency.competencelevel[$i]
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多