我有这个大数组,我需要分解并只在其中显示符合条件的特定元素。
我的数组看起来像这样。
[
{
:id => 9789,
:name => "amazing location",
:priority => 1,
:address_id => 12697,
:disabled => false
},
{
:id => 9790,
:name => "better location",
:priority => 1,
:address_id => 12698,
:disabled => false
},
{
:id => 9791,
:name => "ok location",
:priority => 1,
:address_id => 12699,
:disabled => true
}
]
我需要的是只显示此数组中disabled
设置为true
的元素。
但是当我尝试这个时,我收到错误说明no implicit conversion of Symbol into Integer
array.map do |settings, value|
p hash[:disabled][:true]
end
我想知道是否有其他办法,或者是否有办法做到这一点。如果有人可以看看,我会非常感激。
答案 0 :(得分:3)
通过在数组上为#map
提供两个参数,您实际上得到的是第一个哈希值,然后是nil。实际上,您只想为每个循环并选择禁用为真的那些。您可以使用Array#select
来执行此操作,这将过滤块返回真值的数组的所有元素:
print array.select { |hash| hash[:disabled] }
=> [{:id=>9791, :name=>"ok location", :priority=>1, :address_id=>12699, :disabled=>true}]
答案 1 :(得分:2)
您可以使用简短each
或select
来尝试此操作。
a.each { |k,_v| puts k if k[:disabled] == true }
=> {:id=>9791, :name=>"ok location", :priority=>1, :address_id=>12699, :disabled=>true}
这会遍历您拥有的数组中的每个元素(hash
),并检查每个值上禁用的键的值是否为true,并放置键,例如,您可以将其设置为想做。
或更短:
puts a.select { |k,_v| k[:disabled] }
=> {:id=>9791, :name=>"ok location", :priority=>1, :address_id=>12699, :disabled=>true}
答案 2 :(得分:1)
当您将数组或字符串视为哈希时,会显示错误。
在PHP中,数组键可以是数字或字符串,而在Ruby中,关联数组是一种单独的数据类型,称为哈希。
这是各种foreach变体的备忘单,翻译成惯用的Ruby:
循环数字数组(PHP):
<?php
$items = array( 'orange', 'pear', 'banana' );
# without indexes
foreach ( $items as $item ) {
echo $item;
}
# with indexes
foreach ( $items as $i => $item ) {
echo $i, $item;
}
循环数组(Ruby):
items = ['orange', 'pear', 'banana']
# without indexes
items.each do |item|
puts item
end
# with indexes
items.each_with_index do |item, i|
puts i, item
end
循环关联数组(PHP):
<?php
$continents = array(
'africa' => 'Africa',
'europe' => 'Europe',
'north-america' => 'North America'
);
# without keys
foreach ( $continents as $continent ) {
echo $continent;
}
# with keys
foreach ( $continents as $slug => $title ) {
echo $slug, $title;
}
循环哈希(Ruby):
continents = {
'africa' => 'Africa',
'europe' => 'Europe',
'north-america' => 'North America'
}
# without keys
continents.each_value do |continent|
puts continent
end
# with keys
continents.each do |slug, title|
puts slug, title
end
在Ruby 1.9中,哈希值得到了改进,因此它们保留了内部顺序。在Ruby 1.8中,将项目插入哈希的顺序与它们的存储顺序无关,当您对哈希进行迭代时,结果可能看起来完全随机。现在哈希保留了插入的顺序,这在将它们用于方法定义中的关键字参数时非常有用。 (感谢steenslag纠正我这个)