如何将哈希表添加到多维数组?无法通过成员访问枚举分配值

2024-05-22

我在将哈希表添加到多维数组时遇到问题。我编码如下:

$Data = @{BIBs = @(
    @{$BIB = @{BIBName=$BIBName}, 
    @{Standort = $Standort}, 
    @{Bücher = @(
        @{BuchName = $BuchName; 
        Autor = $Autor
        })
    }}
)}

此代码正在运行并创建一个输出,我将其存储在 JSON 中:

{
    "BIBs": [
        {
            "BIB1": [
                {
                    "BIBName": "123"
                },
                {
                    "Standort": "123"
                },
                {
                    "Bücher": [
                        {
                            "Autor": "123",
                            "BuchName": "123"
                        }
                    ]
                }
            ]
        },
        {
            "BIB2": [
                {
                    "BIBname": "345"
                },
                {
                    "Standort": "345"
                },
                {
                    "Bücher": [
                        {
                            "Autor": "345",
                            "Buchname": "345"
                        }
                    ]
                }
            ]
        }
    ]
}

我有额外的代码,将另一个哈希表添加到数组“BIB”中,如您所见。

$jsonfile = "C:\Skripte\bibV2-1000.json"
$Data = Get-Content $jsonfile | ConvertFrom-Json
$Data.BIBs += New-Object -TypeName PSObject -Property @{
    $BIB = @{BIBname=$BIBName}, @{Standort=$Standort},
           @{Bücher = @(@{Buchname=$BuchName;Autor=$Autor})}
}

当输出如上所示时,我无法向“Bücher”添加另一个哈希表。我检查了“Bücher”的类型

$data.BIBs.BIB1.Bücher.GetType()

它实际上是一个数组:



IsPublic IsSerial Name     BaseType
-------- -------- ----     --------
True     True     Object[] System.Array
  

I tried

$Data.BIBs.BIB1.Bücher += @{Person="Max";Alter="35"}

添加一个新的哈希表,就像我对“BIB2”所做的那样,但我收到错误:



The property 'Bücher' cannot be found on this object. Verify that the property
exists and can be set.
At line:5 char:1
+ $data.BIBs.BIB1.Bücher += @{Motor="asdf";pers="345"}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException
  

你知道我怎么添加吗@{Person="Max";Alter="35"}到“布歇尔”?


tl;dr

Setting键/属性值通过成员访问枚举不支持(见下文)。

相反,你必须获取其特定对象.Bücher您想要显式修改的属性:

($Data.BIBs.BIB1 | ? Bücher).Bücher += @{ BuchName='neues Buch'; Autor='Johann Doe' }

注意:这假设:

  • only one数组的元素$Data.BIBs.BIB1 has a .Bücher属性(关键)
  • 如果该属性/键确实存在,那么它是nonempty因此在布尔上下文中是“truthy”,例如传递给的表达式? (Where-Object);就像成员访问枚举一样,这简化了Where-Object句法 -? Bücher代替? { $_.Bücher }- 是 PSv3+ 功能,称为简化语法 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Simplified_Syntax.

马蒂亚斯·R·杰森 https://stackoverflow.com/users/712649/mathias-r-jessen在对该问题的评论中提供了关键点:

PowerShell 在点符号方面故意不对称具有收藏价值属性为getting价值观对比setting values.

  • On getting, PSv3+ 适用成员访问枚举 https://stackoverflow.com/a/44620191/45375,简而言之,它允许您访问收藏并隐式获取该属性的值该集合中的每个元素,结果收集在array.

  • On setting,成员访问枚举是not applied;理由是无意修改数据的风险太高 - 请参阅GitHub 问题 #5271 https://github.com/PowerShell/PowerShell/issues/5271特别是这条评论 https://github.com/PowerShell/PowerShell/issues/5271#issuecomment-340285892由PS团队核心成员负责。

不幸的是当前的错误消息并没有告诉你这一点.
这是因为当试图set集合级别的属性,仅查找该属性直接在集合上(而不是在它的元素上),它(通常)不存在。

让我们看一个简化的例子:

$data = @{ # a hashtable
  a = ( # array of hashtables
    @{ b1 = 'b1' },
    @{ b2 = 'b2' },
    @{ b3 = 
      @{ b31 = 'b31' }, @{ b32 = 'b32' } # array of hashtables
    }
  )
}

On getting, 一切工作正常:

PS> $data.a.b3

Name                           Value                                                                                                                                                                                                                            
----                           -----                                                                                                                                                                                                                            
b31                            b31                                                                                                                                                                                                                              
b32                            b32                                                                                                                                                                                                                              

虽然$data.a is an [object[]]数组,具有属性的对象(哈希表).b3其间发现了elements,而那个物体的.b3值是输出。
这是实际的成员访问枚举(尽管更典型的用途是该属性存在于all数组的元素以及要收集到的各个值[object[]] array).

On setting,PowerShell 放弃成员访问枚举,因此未能成功寻找.b3财产only直接在[object[]]实例就是$data.a当然,数组没有.b3财产:

PS> $data.a.b3 += @{ b33 = 'b33' }  # Try to add an element; !! FAILS

The property 'b3' cannot be found on this object. 
Verify that the property exists and can be set.
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将哈希表添加到多维数组?无法通过成员访问枚举分配值 的相关文章

  • 在 C 或 C++ 中用 1 到 10^10 之间的随机数填充数组

    我的分配的一部分基于一个数组 其大小由用户指定 其中包含从 1 到 10 10 的随机数 然后我们必须找到数组中第 k 个较小的数字 这是我尝试过的 include
  • Javascript - 将类型化数组保存为 blob 并以二进制数据读回

    我有一个充满二进制数据的类型化数组 它是从 ArrayBuffer 生成的 var myArr new Uint8Array myBuffer 我将其呈现给用户 var blob new Blob myArr type octet stre
  • 如何将数组内部指针设置到特定位置? PHP/XML

    我正在尝试使用 XML 而不是数据库来构建一个小网站 我想构建一个下一个和上一个按钮 该按钮将与我显示的内容相关 我找到了 php 函数 next 和 prev 以及 current 但我不知道如何将指针设置到特定位置以便能够相对于当前页面
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • Java:数组和向量

    我习惯于使用 PHP 但最近我一直在使用 Java 并且试图解决这个问题让我很头疼 我想用 Java 保存这个表示 Array col name 1 gt Array 1 gt col value 1 2 gt col value 2 n
  • 将 numpy 数组传递给 C++

    我有一些用 Python 编写的代码 其输出是 numpy 数组 现在我想将该输出发送到C 代码 其中将执行大部分计算 我尝试过使用 cython 的public cdef 但我正在处理一些问题 我将感谢您的帮助 这是我的代码 pymodu
  • Swift:HackerRank readLine 一个 Int 数组

    我正在玩 HackerRank 我需要从行读取整数数组的问题之一 A 1 2 3 B 1 4 7 I tried let line readLine print line 但我收到这个错误 solution swift 2 7 warnin
  • 如何从数组中获取唯一的项?

    我是 Java 初学者 我发现了一些关于这个主题的主题 但没有一个适合我 我有一个像这样的数组 int numbers 1 1 2 1 3 4 5 我需要得到这个输出 1 2 3 4 5 该数组中的每个项目仅一次 但如何获得呢 最简单的解决
  • 在yaml中写入#(在字符串中)

    我是新使用 yml 文件 用于我的框架中的翻译 我试图在翻译中添加一个 将是一个推特分享 blabla 这可能吗 因为文件将其翻译为评论 只需将值放在单引号或双引号内 它就不会被视为注释 就像是 en twitter share hasht
  • STL 容器速度与数组

    我刚刚开始从事一个科学项目 其中速度非常重要 HPC 我目前正在设计数据结构 该项目的核心是双值 3D 网格 以求解偏微分方程 由于这里的速度可能比代码的简单性更重要 我想知道 STL 与通常的 C 风格数组相比如何执行 就我而言 因为它是
  • Java-使用递归压平数组

    我一直在练习算法 递归一直是我的弱项 该问题要求将嵌套数组展平为单个数组 如果使用给出 O n 3 给定相同大小的 3d 数组 解决方案的循环 这将很简单 然而 通过递归 我已经挣扎了几个小时 这就是我所拥有的 请注意 我已经尝试过使用我的
  • 有没有办法更改 C# 数组内的元组值?

    我正在使用的数组是int 我想在一个方法中创建每个 我假设的 元组的第一个值 然后我想多次修改后两个值 在另一种方法中 例如 int MyArrayGet int myArray int myArray new int 9 9 9 for
  • 如何通过 *.csproject 文件查找参考路径

    我想制作一个自动化的 powershell 脚本 报告项目的引用和引用路径 当 csproj 中的提示路径未填写时 我找不到获取引用路径的方法 这是一个快速解决方案 它抓住了每一个 csproj当前目录下的文件 并检查每个引用 对于从 GA
  • 根据javascript中对象数组中的id替换特定对象

    我有一系列像这样的对象 var books id 1 name Name of the wind year 2015 rating 4 5 author 2 现在我有一个函数 editBooks 它要求用户提供 id 并用用户给出的值替换具
  • 字符串插值搜索

    对于那些不熟悉插值搜索的人来说 这是一种在排序数组中搜索值的方法 可能比二分搜索更快 您查看第一个和最后一个元素 并 假设数组的内容均匀分布 线性插值以预测位置 例如 我们有一个长度为 100 的数组 其中 array 0 0 和 arra
  • 将 redux 数据保存为 state 中的对象数组,如果 state 有先前的状态可用,则更新状态

    我收到的回复如下格式示例 const response data name abc age 10 id 10 name def age 15 id 20 name abc 我想将其保存在我的 redux 状态中 如果 response na
  • JSON 为 foreach() 提供的参数无效

    我在从 JSON 检索数据时遇到一些问题 它总是说为 foreach 提供的参数无效 这是 url php 中的 JSON nama IT SERVICE SOLUTION nilai 0 periode 11 tahun 2014 nam
  • 在 C# 中对由整数组成的多维 [] 数组进行排序

    我有以下数组 private int testSamples new testSamples 101 101 它应该代表一个名册 第0到100列 第0到100行 在这个名册中 掉落了各种化学液体 我为之做这件事的人希望以这样的方式工作 他可
  • 如果多个键是相同的 JS,则对对象中的值求和

    例如我有 5 个对象 row aa col 1 value 1 row bb col 2 value 1 row bb col 3 value 1 row aa col 1 value 1 row aa col 2 value 1 我想对值

随机推荐