从以数组为值的哈希中获取数组

     2023-03-16     287

关键词:

【中文标题】从以数组为值的哈希中获取数组【英文标题】:Get array from hash with arrays as values 【发布时间】:2017-07-04 21:32:13 【问题描述】:

给定以下哈希hash,其中键作为符号,值作为数组:

hash
#=> :stage_item=>[:stage_batch_id, :potential_item_id], :item=>[:id, :size, :color, :status, :price_sold, :sold_at], :style=>[:wholesale_price, :retail_price, :type, :name]

我如何获得一个仅将值(数组)相加的数组?

我知道我可以使用#each_with_object#flatten

hash.each_with_object([])  |(k, v), array| array << v .flatten
#=> [:stage_batch_id, :potential_item_id, :id, :size, :color, :status, :price_sold, :sold_at, :wholesale_price, :retail_price, :type, :name]

但我希望只有 #each_with_object 可以工作:

hash.each_with_object([])  |(k, v), array| array += v 
#=> []

虽然每个 with 对象的重点是它跟踪累加器(在这种情况下名为 array),所以我可以像下面的示例一样 += 它:

arr = [1,2,3]
#=> [1, 2, 3]
arr += [4]
#=> [1, 2, 3, 4]

我错过了什么?

【问题讨论】:

【参考方案1】:

Array &lt;&lt; .. 就地更改原始数组:

irb(main):014:0> a = original = []
=> []
irb(main):015:0> a << [1]
=> [[1]]
irb(main):016:0> a
=> [[1]]
irb(main):017:0> original
=> [[1]]
irb(main):018:0> a.equal? original  # identity check
=> true

Array += .. 在不改变原数组的情况下返回一个新数组:

irb(main):019:0 a = original = []
=> []
irb(main):020:0> a += [1]
=> [1]
irb(main):021:0> a
=> [1]
irb(main):022:0> original
=> []
irb(main):023:0> a.equal? original
=> false

根据Enumerable#each_with_object documentation,

使用任意对象迭代每个元素的给定块 给定,并返回最初给定的对象。

如果没有给出块,则返回一个枚举器。

所以,如果是+=,则返回未修改的初始空数组。


顺便说一句,您可以简单地使用Hash#values method,而不是使用each_with_object,它会返回一个填充了哈希值的新数组:

hash.values.flatten

【讨论】:

【参考方案2】:

如果你坚持使用Array#+,实际上inject会更合适:

hash.inject([])  |a, (_, v)| a + v 

您通常使用each_with_object 而不是inject 的原因是,如果您想就地累积结果而不是使用块的返回值作为累加器。在这种情况下,array1 + array2 返回连接,因此您不需要使用修改备忘录对象的运算符(或方法),因为 Array#+ 返回您想要输入下一个循环的内容。

虽然我们在这里,但这些会更简单:

hash.values.flatten
hash.values.inject(:+)
h.values.flat_map(&:itself)

如果您真的喜欢调用该方法,第二个甚至使用Array#+

【讨论】:

Perl如何访问作为另一个哈希值的数组元素的哈希?

】Perl如何访问作为另一个哈希值的数组元素的哈希?【英文标题】:PerlHowtoaccessahashthatistheelementofanarraythatisthevalueofanotherhash?【发布时间】:2010-11-1201:01:08【问题描述】:我正在尝试创建一个以数组为值的哈希。值的第一个元素... 查看详情

以数组为值对哈希表进行排序

】以数组为值对哈希表进行排序【英文标题】:SortHashtablewithArraysasvalues【发布时间】:2017-12-1312:39:08【问题描述】:描述:我正在构建一个搜索文件的PowerShell脚本,然后给它们提供唯一的名称,复制它们,然后通过哈希计算验... 查看详情

java示例代码_在以对象为值的Java哈希表中,如何返回对象值

java示例代码_在以对象为值的Java哈希表中,如何返回对象值 查看详情

Redis节点 - 从哈希中获取 - 不插入数组

】Redis节点-从哈希中获取-不插入数组【英文标题】:RedisNode-Getfromhash-Notinsertingintoarray【发布时间】:2018-08-0308:48:11【问题描述】:我的目标是插入从redis哈希中获得的值。我正在使用nodejs的redis包。我的代码如下:getFromHash(ids)co... 查看详情

从 NSDictionary 数组中获取具有值的数组

】从NSDictionary数组中获取具有值的数组【英文标题】:GettingArraywithvaluesfromanarrayofNSDictionary【发布时间】:2012-03-0212:19:37【问题描述】:我有一个包含4个字典的数组,其中键为@"preference",如下所示(preference=Nose;,preference="Heartrate";... 查看详情

如何从对象数组中的嵌套数组中获取数组值的组合

】如何从对象数组中的嵌套数组中获取数组值的组合【英文标题】:Howtogetthecombinationofarrayvaluesfromnestedarraysinanarrayofobjects【发布时间】:2019-11-2003:47:49【问题描述】:我有一个具有以下结构的对象数组:varvarientSections=[type:"frame",... 查看详情

在 Powershell 中输出数组的哈希表

】在Powershell中输出数组的哈希表【英文标题】:OutputahashtableofArraysinPowershell【发布时间】:2011-07-2612:53:53【问题描述】:我束手无策。我是powershell的新手,我已经尝试了所有我能在网上找到的关于这个主题的东西。我想要做的... 查看详情

对象键值对的形式转换成对象组成数组的形式(键为值的形式)

比如说constcategoryProp=食品:34,家居生活:23,运动户外:12转换成[name:食品,value:34,name:家居生活,value:23,name:运动户外,value: 查看详情

ActionScript 3.0 - 获取数组中相同值的计数

】ActionScript3.0-获取数组中相同值的计数【英文标题】:ActionScript3.0-getthecountofthesamevalueinanarray【发布时间】:2018-03-0923:22:03【问题描述】:在actionscript3中工作并遇到数组问题。我有一个包含数字的数组,[1,2,3,4,2,1,2,3,4]如何计算... 查看详情

使用javascript获取数组中真/假值的数量

】使用javascript获取数组中真/假值的数量【英文标题】:Getthenumberoftrue/falsevaluesinanarrayusingjavascript【发布时间】:2015-11-1314:47:41【问题描述】:我有一个具有属性id和value的数组vararrayObj=["id":1,"value":true,"id":2,"value":false,"id":3,"value":... 查看详情

从 PHP 中的 UUID 数组中获取唯一的哈希 ID

】从PHP中的UUID数组中获取唯一的哈希ID【英文标题】:GettinganuniquehashIDfromarrayofUUIDsinPHP【发布时间】:2021-07-2922:16:49【问题描述】:为UUID数组创建唯一标识符的最佳方法是什么?我有一个由多个组件组成的产品,每个组件都有... 查看详情

动态获取/设置多维数组中的值的函数

】动态获取/设置多维数组中的值的函数【英文标题】:functionstoget/setvaluesinmultidimensionalarraysdynamically【发布时间】:2012-01-0420:22:02【问题描述】:我正在尝试用php编写购物车,但在获取/设置多维数组中的值时遇到问题。我将当... 查看详情

获取数组中每第 n 个值的平均值

】获取数组中每第n个值的平均值【英文标题】:Getanaverageofvalueseverynthvalueinarray【发布时间】:2013-11-2823:56:12【问题描述】:我有以下数组,它们的键是unix时间戳,我怎样才能在一个新数组中以每30秒的间隔获取平均值,例如,... 查看详情

哈希是什么?为什么哈希存取比较快?

...到小萌。  个人理解    哈希表其实就是一个一维数组,而数组中的每一个元素都是一个单向链表而已。这样的数据结构解决了数 查看详情

如何合并散列数组以获取值数组的散列

】如何合并散列数组以获取值数组的散列【英文标题】:Howtomergearrayofhashestogethashofarraysofvalues【发布时间】:2011-07-2608:17:43【问题描述】:这与TurningaHashofArraysintoanArrayofHashesinRuby相反。优雅和/或高效地将散列数组转换为值是所... 查看详情

获取字典最小值的键,而该键在数组中

】获取字典最小值的键,而该键在数组中【英文标题】:getthekeyoftheminimumvalueofadictionarywhichinturnthekeyisinanarray【发布时间】:2021-12-0622:22:06【问题描述】:我想获取给定字典中具有最小值的键,但条件是该键在给定列表中例如,... 查看详情

TypeaheadJS 方法未将数组转换为值

】TypeaheadJS方法未将数组转换为值【英文标题】:TypeaheadJSMethodnotconvertingArraytovalues【发布时间】:2015-05-2215:10:22【问题描述】:我正在使用typeahead.js。当我从apiController获取数据时,它看起来像这样:["JobName1","JobName1","akhsfkh"]当... 查看详情

使用charAt循环数组以获取javascript中每个值的首字母

】使用charAt循环数组以获取javascript中每个值的首字母【英文标题】:loopoverarrayusingcharAttogetfirstletterofeachvalueinjavascript【发布时间】:2014-01-1819:52:56【问题描述】:我是JS新手,正在尝试了解chartAt。我创建了一个问题,我想通过... 查看详情