ruby hash作为数组的第一个元素

时间:2015-12-08 07:53:16

标签: arrays ruby hash

我正在从API解析JSON。我有一个foo元素,有时是一个哈希值,另一个是哈希数组。

foo: { ... }

foo: [
  { ... },
  { ... }
]

我想使用Array(foo)始终获取至少包含一个元素的数组,但它会将哈希值转换为[[..., ...], [..., ...]]。除了使用foo.is_a?(Hash/Array)

之外,还有一种优雅的方法可以解决这个问题

3 个答案:

答案 0 :(得分:3)

在Rails环境中,可以访问cd {YOUR_PROJECT_DIR}/platforms/android/cordova [run/build]

您可以使用activesupport

Array.wrap

如果没有Rails,您可以执行foo = { a: :b } => {:a=>:b} Array.wrap(foo) => [{:a=>:b}] Array.wrap([1,2,3]) => [1, 2, 3] ,然后在您的代码中执行:gem install activesupport

答案 1 :(得分:3)

添加到@yez答案,如果您未使用activesupport,则可以Array扩展wrap功能:

def Array.wrap(object)
  if object.nil?
    []
  elsif object.respond_to?(:to_ary)
    object.to_ary || [object]
  else
    [object]
  end
end

http://apidock.com/rails/Array/wrap/class

复制

实现它的另一种粗略方式是:

def Array.wrap(object)
  return [] if object.nil?
  [object].flatten(1)
end

答案 2 :(得分:2)

如果你想使用普通的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}]

即。 [foo].flatten(1)应该有用。

相关问题