我的收藏是一个包含许多字典的集合。如何遍历 Set 中的每个字典以选择特定键。
a Set(a Dictionary('age'->'25' 'code'->2512) a Dictionary('age'->'40' 'code'->'1243') a Dictionary('age'->'35' 'code'->'7854'))
set := {
{ 'age'->'25'. 'code'->'2512' } asDictionary .
{ 'age'->'40'. 'code'->'1243' } asDictionary.
{ 'age'->'35'. 'code'->'7854' } asDictionary.
} asSet.
如果您只对检索单个项目感兴趣,那么detect:
就是要走的路。它将返回与谓词(块)匹配的第一个项目。请注意,Set
它没有定义的顺序,因此如果您有多个匹配的项目,它可能会在不同的时间返回不同的项目。
d := set detect: [ :each | (each at: 'code') = '1243' ].
d. "a Dictionary('age'->'40' 'code'->'1243' )"
如果要检索与谓词都匹配的多个项目,请使用select:
multi := set select: [ :each | (each at: 'age') asNumber >= 35 ].
multi. "a Set(a Dictionary('age'->'40' 'code'->'1243' ) a Dictionary('age'->'35' 'code'->'7854' ))"
从评论更新评论:
正如卡洛斯已经说过的,collect:
会做你需要的。它将转换块应用于集合中的每个项目,然后返回结果集合。
codes := set collect: [ :each | each at: 'code' ].
适用于任何收藏
#(2 3 4) collect: [ :each | each squared ] "#(4 9 16)"
为了进一步了解,我建议阅读 Pharo By Example 书中的 Collections 章节https://ci.inria.fr/pharo-contribution/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/Collections/Collections.html
mySet do: [:each | each do: [ :i | i doStuff ]]
或使用检测(我不确定检测是否像这样工作,到目前为止我从未使用过):
mySet do: [:i | i detect: [ :each| (each at: 'key') doStuff ]].
或使用keysDo:
mySet do: [:each | each keysDo: [ :k | k doStuff ]]