2017-01-13 4 views
3

これを追加するのは、私が求めているものが見当たらない人がいるためですが、他の配列と比べて各配列の固有の値を探しています。ハッシュの配列を互いに比較して、両方とも

saved_startincoming_startの違いだけでなく、incoming_startsaved_startの間の違いを見つける必要があります。 saved_startはdbクエリの結果、incoming_startはwebhookのparamsの結果です。ここで開始するには、2つの配列です:

saved_start = [{id: "12345", qty: 25}, {id: "678", qty: 20}] 
incoming_start = [{id: "12347", qty: 25}, {id: "678", qty: 20}, {id: "abc", qty: 20}] 

は、私は配列の違いを見つける:

in_array = incoming_start - saved_start 
saved_array = saved_start - incoming_start 

上記リターン:

in_array => [{:id=>"12347", :qty=>25}, {:id=>"abc", :qty=>20}] 
saved_array => [{:id=>"12345", :qty=>25}] 

そしてそれを見つけるためにそれらを反復処理しますin_arrayは、id12347であり、abcであり、saved_arrayではありません。 saved_arrayid12345in_arrayがありません。数量についても同じことが言えます。

これは、in_arraysaved_arrayが同じサイズの場合にうまく機能します。そうでなければ、それは壊れます。ウェル

in_array.each do |incoming| 
    saved_array.each do |saved| 
    pp "Does the saved hash have the id #{incoming[:id]} 
    #{saved.has_value?(incoming[:id])}" 
    pp "Does the saved hash have the quantity of 
    #{incoming[:qty]} #{saved.has_value?(incoming[:qty])}" 
    end 
end 

上記作品in_arrayは以下saved_array

よりも大きいためsaved_arrayが小さいので、不良データを返します。英語で

saved_array.each do |saved| 
    in_array.each do |incoming| 
    pp "Does the incoming hash have the id #{saved[:id]} 
    #{incoming.has_value?(saved[:id])}" 
    pp "Does the incoming hash have the quantity of #{saved[:qty]} 
    #{incoming.has_value?(saved[:qty])}" 
    end 
end 

、私はsaved_startincoming_startと同じデータを含むようにする必要があります。

しかしこれを行うには、saved_startの中にあるものはではないので、から削除することができます。次に、 'saved_start'に入っているものが 'saved_start'にないので、追加することができます。そして最後にidが両方にありますが、qtyincoming_startで異なる場合は、saved_startを更新する必要があります。

やれやれ...

おかげ

+3

受け取る予定の結果を投稿してください。 – mudasobwa

+0

更新!質問の一番下の英語をご覧ください。 – ToddT

+0

なぜ 'saved_start = incoming_start'ですか? – Doguita

答えて

0

こんにちは、私は次のコードは役立つかもしれない願っています。このコードは次のようになります:(01) - 配列1の値は配列2に見つかりません...(02) - 配列2の値を配列1に見つかりません...(03) - 配列2のすべての一意の値を保存します。 ...私はこれを探していると思う質問の説明については、簡単に私は配列の名前を変更する:arr1 & arr2。

#Compare an array of hashes against each other, both ways 

saved_start = [{id: "12345", qty: 25}, {id: "678", qty: 20}] 
incoming_start = [{id: "12347", qty: 25}, {id: "678", qty: 20}, {id: "abc", qty: 20}] 

    # storing in an Array with easier name 
p arr1 = saved_start 
p arr2 = incoming_start 
puts 

    # Initialize array where the Non duplicated vales will be stored 
not_in_arr_1, not_in_arr_2 = [], [] 


    # Check if the arrays are same 
if (arr1 == arr2) == true then 
    puts "Arrays are equal" 

else 
    puts "Arrays NOT Equals" 

    # ---------------------------- 

     # Storing Values from array 1 not found in array 2 
    arr1.length.times do |x| 
     if arr2.include?(arr1[x]) == false then 
      not_in_arr_2 << arr1[x] 
     end 
    end 

    # ---------------------------- 

     # Storing Values from array 2 not found in array 1 
    arr2.length.times do |x| 
     if arr1.include?(arr2[x]) == false then 
      not_in_arr_1 << arr2[x] 
     end 
    end 

    # ---------------------------- 

     # concatenating original Array2 + values of Array1 not found in Array 2 
    arr2.concat not_in_arr_2 

    # ---------------------------- 

     # Console Printing Results 
    puts 
    puts "Values in array 1, NOT found in array 2:" 
    p not_in_arr_2 
    puts 

    puts "Values in array 2, NOT found in array 1:" 
    p not_in_arr_1 
    puts 

    puts "Array 2 with updated values:" 
    p arr2 
    # ---------------------------- 

end 

# ---------------------------------------- 
#  Test Run 
# 
# [{:id=>"12345", :qty=>25}, {:id=>"678", :qty=>20}] 
# [{:id=>"12347", :qty=>25}, {:id=>"678", :qty=>20}, {:id=>"abc", :qty=>20}] 
# 
# Arrays NOT Equals 
# 
# Values in array 1, NOT found in array 2: 
# [{:id=>"12345", :qty=>25}] 
# 
# Values in array 2, NOT found in array 1: 
# [{:id=>"12347", :qty=>25}, {:id=>"abc", :qty=>20}] 
# 
# Array 2 with updated values: 
# [{:id=>"12347", :qty=>25}, {:id=>"678", :qty=>20}, {:id=>"abc", :qty=>20}, {:id=>"12345", :qty=>25} 
# 
# ---------------------------------------- 

私はこれが役に立ちます。 ;)

関連する問題