2016-09-01 42 views
1

從我的last question,我似乎無法得到我想要的。下面解釋好多了:如果物品存在x次,運行代碼

external = ["apple"] 
internal = ["grapes", "pear", "mangoes", "apple"] 

external.each do |fruit| 
if not internal.include?("apple") # fruit will be in place of apple. 
    puts "yes" 
    # run code 
end 
end 

到目前爲止這是打印一次。如何讓它打印三次?在英文中,我要說的是,如果apple存在,請單獨留下apple,給我其他人,並運行下面的代碼。如果有4個項目,其中一個是apple,則運行代碼三次。如果apple不存在,則運行代碼4次。

我希望這個很清楚。由於

我需要100%精確

內部是一個模型(Postgres的) 外部是shopify API(陣列)

我已經在我的數據庫,Bar保存shopify的產品ID,在名爲foo的列上。 Bar.first.foo給我Shopify的ID。 Bar將擁有其他物品,不含shopify編號。所以,如果shopify在那裏,給我休息。這就是爲什麼我想出了:

external.each do |fruit| 
if not internal.include?("apple") # fruit will be in place of apple. 
    puts "yes" 
    # run code 
end 
end 

我的代碼的精確編輯:

externalshopify product response

external = # shopify's response (forget about the above example). 
internal = Product.all # All of the user's products 

所以在我的產品型號中,我有一個產品ID。該ID是用於shopify產品。例如:

Product.first.product_id = # "8cd66767sssxxxxx" 

在同樣的Model(Product)中,我有更多的對象以及Shopify產品ID。我需要的所有對象,除了ID 8cd66767sssxxxxx

Product.last.product_id = # "BOOK" etc but not a shopify id. 

fl00r的回答工作在我的控制檯,而不是在控制器中。奇怪的。這對我來說很有用。

external.each do |e| 
    internal.each do |i| 
    puts i.product_id unless i.product_id == e.id.to_s 
    end 
end 

小問題。在第一次迭代中,包含id,但不在第二次。不知道從這裏做什麼。

+2

(內部 - 外部).each {| fruit |把'是'#你的代碼} –

+0

那麼輸出是什麼? – fl00r

+0

@ fl00r'<產品:0x007fea45101da0>'x13(全部如果數組)。我期待x12。 – Sylar

回答

3

你爲什麼不這樣做?

(internal - external).each do |fruit| 
    puts 'yes' 
    #your code 
end 
+0

對不起,我可能不太清楚。這是一個簡化了示例的數組對象。 'external'是一個api對象,而'internal'是我的本地數據庫。 – Sylar

1

另一種方法是重新考慮你的外部數據結構。 Set會更適合這裏(我們將使用Hash雖然):

external = ["apple"] 
internal = ["grapes", "pear", "mangoes", "apple"] 

external_hash = external.each_with_object({}){ |o, h| h[o] = true } 

internal.each do |item| 
    unless external_hash[item] 
    p item 
    end 
end 
#=> "grapes" 
#=> "pear" 
#=> "mangoes" 

,或者你可以過濾內部列表第一

internal_filtered = internal.reject{ |item| external_hash[item] } 
internal_filtered.each do |item| 
    p item 
end 
#=> "grapes" 
#=> "pear" 
#=> "mangoes" 

轉換ArrayHash將花費O(n)你和每個以下查找將花費攤銷O(1)

因此總的複雜度將是O(n+m),其中n是外部列表的大小,m是內部列表的大小。

+0

我不需要蘋果。我需要避開蘋果,然後休息。 – Sylar

+0

@Sylar do it vise verse then :) – fl00r

+0

好的...讓我看看。 – Sylar