2012-01-06 7 views
0

配列要素のマッチング:すべての[0]お互いに、それが収まる場合セット」をマッチング難しい私はこの配列だ

@array = [["1003", "http://www.google.com/2"], ["963", "http://www.google.com/1"]] 
  1. @array = [["1003", "4"], ["963", "3"], ["1006", "1"], ["1064", "1"], ["1095", "1"], ["963", "http://www.google.com/1"], ["1003", "http://www.google.com/2"]] 
    

    を、私は、結果としてこれを必要としますhttp:link "を[1]に設定します。

  2. 一致するエントリをすべて削除します。

これはどのように可能ですか?

答えて

8
Hash[@array].reject{|k,v| v == "1"}.to_a 

これが何をやっている:

初期化配列:

@array => [["1003", "4"], ["963", "3"], ["1006", "1"], ["1064", "1"], ["1095", "1"], ["963", "http://www.google.com/1"], ["1003", "http://www.google.com/2"]] 

変換をハッシュする:

hash = Hash[@array] => {"1003"=>"http://www.google.com/2", "963"=>"http://www.google.com/1", "1006"=>"1", "1064"=>"1", "1095"=>"1"} 

削除した値である場合== "1":

hash = hash.reject!{|k,v| v == "1"} => {"1003"=>"http://www.google.com/2", "963"=>"http://www.google.com/1"} 

バック配列に変換します。

hash.to_a => [["1003", "http://www.google.com/2"], ["963", "http://www.google.com/1"]] 

が拒否はdelete_if

+0

OPの出力と一致するには、最後に 'to_a 'が必要です。 – iain

+0

最後に追加の 'to_a'があるので、OP形式の配列形式です。 –

+0

あなたは私の一日をたくさん作りました! –

0

魔法の別名です!

@array = [["1003", "4"], ["963", "3"], ["1006", "1"], ["1064", "1"], ["1095", "1"], ["963", "http://www.google.com/1"], ["1003", "http://www.google.com/2"]] 

@links = @array.select { |item| item[1].match(/http/)} 
@non_links = @array - @links 
@non_links.map do |non_link| 
    if @links.map(&:first).include? non_link.first 
    [non_link.first, @links.select { |link| link.first == non_link.first }.first.last] 
    end 
end.compact 
+0

これは長い魔法です。 –

+1

私はチーズを責める! –

+0

Thx、これは "@links = @ array.select {| item | item [1] .match(/ http /)} "は私のために非常に役立ちました! –

関連する問題