Arrays ruby哈希作为数组的第一个元素
我正在解析来自API的JSON。我有一个Arrays ruby哈希作为数组的第一个元素,arrays,ruby,hash,Arrays,Ruby,Hash,我正在解析来自API的JSON。我有一个foo元素,有时是散列,有时是散列数组 foo: { ... } foo: [ { ... }, { ... } ] 我只想使用Array(foo)始终获取至少包含一个元素的数组,但它会将哈希转换为[…,…],[…,…]。除了在Rails环境中使用foo.Is_a?(散列/数组)?并访问activesupport之外,还有一种优雅的方法来处理这个问题吗 您可以使用Array.wrap foo = { a: :b } => {:a=>
foo
元素,有时是散列,有时是散列数组
foo: { ... }
foo: [
{ ... },
{ ... }
]
我只想使用
Array(foo)
始终获取至少包含一个元素的数组,但它会将哈希转换为[…,…],[…,…]
。除了在Rails环境中使用foo.Is_a?(散列/数组)
?并访问activesupport之外,还有一种优雅的方法来处理这个问题吗
您可以使用Array.wrap
foo = { a: :b }
=> {:a=>:b}
Array.wrap(foo)
=> [{:a=>:b}]
Array.wrap([1,2,3])
=> [1, 2, 3]
如果没有Rails,您可以执行gem安装activesupport
,然后在您的代码中:在Rails环境中需要“activesupport”
,并访问activesupport
:
您可以使用Array.wrap
foo = { a: :b }
=> {:a=>:b}
Array.wrap(foo)
=> [{:a=>:b}]
Array.wrap([1,2,3])
=> [1, 2, 3]
如果没有Rails,您可以执行gem安装activesupport
,然后在代码中:需要“activesupport”
添加到@yez answer中,如果您没有使用activesupport
,您可以扩展数组
以具有wrap
功能:
def Array.wrap(object)
if object.nil?
[]
elsif object.respond_to?(:to_ary)
object.to_ary || [object]
else
[object]
end
end
抄袭
另一种粗略的实施方法是:
def Array.wrap(object)
return [] if object.nil?
[object].flatten(1)
end
添加到@yes answer,如果您没有使用activesupport
,您可以扩展Array
以具有wrap
功能:
def Array.wrap(object)
if object.nil?
[]
elsif object.respond_to?(:to_ary)
object.to_ary || [object]
else
[object]
end
end
抄袭
另一种粗略的实施方法是:
def Array.wrap(object)
return [] if object.nil?
[object].flatten(1)
end
如果要使用纯Ruby解决此问题,则可以将项(哈希数组或哈希)推送到空数组,然后按如下方式展平数组:
2.0.0-p247 :001 > [{a:1}].flatten(1)
=> [{:a=>1}]
2.0.0-p247 :002 > [[{a:1},{b:2}]].flatten(1)
=> [{:a=>1}, {:b=>2}]
i、 e.[foo].flatten(1)
应该可以工作。如果您想使用纯Ruby解决它,那么您可以将项(哈希数组或哈希数组)推到空数组,然后按如下方式展平数组:
2.0.0-p247 :001 > [{a:1}].flatten(1)
=> [{:a=>1}]
2.0.0-p247 :002 > [[{a:1},{b:2}]].flatten(1)
=> [{:a=>1}, {:b=>2}]
i、 e.[foo].flatte(1)
应该可以工作。您应该使用flatte(1)
来避免展平嵌套数组。是的,但问题没有Rails标记,因此纯Ruby解决方案是最重要的。您应该使用flatte(1)
来避免展平嵌套数组。是的,但问题没有Rails标记,因此,一个纯粹的Ruby解决方案是人们最感兴趣的。你不需要推送,只要:[{a:1}]。展平
/[[{a:1},{b:2}]]。展平
感谢Stefan的支持。上面的答案应该足以满足Dudo的要求,而无需使用积极的支持。i、 e.他将foo元素作为散列或散列数组获取,并希望将其转换为散列数组或散列数组。我只想指出,[].push(obj)
相当于[obj]
明白了你的意思。[foo]。扁平化应该可以工作。编辑了答案。这是最好的答案,依我看,简短、甜美、纯正的Ruby,正如问题所要求的那样。您还可以编写[*[obj]]
;e、 例如,[*[{a:1}].[{a:a=>1}]
,[*[{a:1,b:2}].[{:a=>1,b=>2}]
。你不需要推送
,只要:[{a:1}]。展平
/[{code>[{a:1},{b:2}]。展平。谢谢你的代码输入。上面的答案应该足以满足Dudo的要求,而无需使用积极的支持。i、 e.他将foo元素作为散列或散列数组获取,并希望将其转换为散列数组或散列数组。我只想指出,[].push(obj)
相当于[obj]
明白了你的意思。[foo]。扁平化应该可以工作。编辑了答案。这是最好的答案,依我看,简短、甜美、纯正的Ruby,正如问题所要求的那样。您还可以编写[*[obj]]
;e、 例如,[*[{a:1}].=>[{a:a=>1}]
,[*[{a:1,b:2}].[{:a=>1,b=>2}]
.gem安装activesupport;需要activesupportgem安装activesupport;需要ActiveSupport考虑到您没有Rails标记,为什么要加载像ActiveSupport
这样大的东西来执行简单的计算?没有比@Veet的方式更简单的了。即使缺少Rails标记是一个疏忽,您现在也不能很好地添加它。@CarySwoveland correct。这是宝石,所以只有红宝石。谢谢考虑到您没有Rails标记,为什么要加载像ActiveSupport
这样大的东西来执行简单的计算?没有比@Veet的方式更简单的了。即使缺少Rails标记是一个疏忽,您现在也不能很好地添加它。@CarySwoveland correct。这是宝石,所以只有红宝石。谢谢