2017-03-21 7 views
0

私はこの大規模な配列を分解し、条件内の特定の要素のみを表示する必要があります。配列をループし、基準に一致する要素を表示する

私の配列は次のようになります。私は必要なもの

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

truedisabledセットを持って、この配列内の要素を表示することです。私はこれをしようとすると

はしかし、私は別の方法があるかどうか、これを行う方法がある場合、私は思ったんだけどno implicit conversion of Symbol into Integer

array.map do |settings, value| 
    p hash[:disabled][:true] 
end 

を示すエラーを取得します。もし誰かが見ていれば、私はそれを高く評価します。

答えて

2

あなたが短いeachselectでこれを試すことができます。配列内の各要素(hash)を超える

a.each { |k,_v| puts k if k[:disabled] == true } 
=> {:id=>9791, :name=>"ok location", :priority=>1, :address_id=>12699, :disabled=>true} 

この繰り返し処理を、あなたは持っていると、それぞれの値のキー無効の値がtrueで、ちょうど例えば、キーを置くかどうかを確認するには、あなたはあなたのようにそれを設定することができますやってみたいです。

か短い:あなたはハッシュとして、配列や文字列を処理しているとき

puts a.select { |k,_v| k[:disabled] } 
=> {:id=>9791, :name=>"ok location", :priority=>1, :address_id=>12699, :disabled=>true} 
+1

ブロック内に 'puts'を実行しているのであれば、最初の例では' select'を使うことは実際にはありません。 'each'はちょうど良いことをするでしょう –

+0

私は私のレールプロジェクトの中で、私は' NoMethodError:privateメソッド 'select 'nil:NilClass'を呼び出すようになっています。その周りの最善の方法は今のところです。 – kdweber89

+0

あなたは正しいです@IgorPantović、私は答えを編集しました。 –

3

配列の#mapに2つの引数を指定すると、実際には最初のハッシュが得られてからnilになります。実際にはそれぞれをループし、無効になっているものを選択するだけです。代わりにArray#selectでブロックがtruthy値を返す配列のすべての要素をフィルタリングするであろうことを行うことができます。

print array.select { |hash| hash[:disabled] } 
=> [{:id=>9791, :name=>"ok location", :priority=>1, :address_id=>12699, :disabled=>true}] 
1

あなたのエラーが表示されます。

PHPでは配列キーは数字か文字列のどちらでもかまいませんが、Rubyの連想配列はハッシュと呼ばれる別のデータ型です。

はここで慣用のRubyに翻訳され、様々なforeachの変種のためのチートシート、です:

:配列(ルビー)を超えるループ

<?php 

$items = array('orange', 'pear', 'banana'); 

# without indexes 
foreach ($items as $item) { 
    echo $item; 
} 

# with indexes 
foreach ($items as $i => $item) { 
    echo $i, $item; 
} 

は、数値配列(PHP)の上にループ

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 

assocを使用したループiativeアレイ(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; 
} 

ハッシュ(ルビー)にわたってループ:彼らは彼らの内部の順序を維持するように1.9ハッシュが改善されたルビーで

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で。図8に示すように、アイテムをハッシュに挿入した順番は、保存された順序と相関がなく、ハッシュを反復したときには完全にランダムに見えることがあります。現在、ハッシュは挿入の順序を保持しています。これは、メソッド定義のキーワード引数に使用する場合には明らかに便利です。 (これについて私に訂正してくれたことに感謝します)

+0

「Rubyハッシュ内の要素は注文されていません。」ハッシュは、Ruby 1.9.0(2007年)以降の挿入順序を保持します。 – steenslag

関連する問題