循环遍历数组,显示符合条件的元素

时间:2017-03-21 15:13:55

标签: arrays ruby

我有这个大数组,我需要分解并只在其中显示符合条件的特定元素。

我的数组看起来像这样。

[
  {
                 :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 

我想知道是否有其他办法,或者是否有办法做到这一点。如果有人可以看看,我会非常感激。

3 个答案:

答案 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)

您可以使用简短eachselect来尝试此操作。

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纠正我这个)