Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays ruby哈希作为数组的第一个元素_Arrays_Ruby_Hash - Fatal编程技术网

Arrays ruby哈希作为数组的第一个元素

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=>

我正在解析来自API的JSON。我有一个
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。这是宝石,所以只有红宝石。谢谢