簡體   English   中英

過濾哈希數組並修改 Ruby 中的重復項

[英]Filter array of hashes and modify duplicates in Ruby

我想根據某些內容條件過濾 Ruby 中的 params[] 哈希數組。 我看過其他一些討論,但需求不同。

我的數組示例:

{"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"Grand Vin", "optimized_country_id"=>"1", "season_id"=>"a9840059-cc91-47aa-9098-4bf8a45655e7", "verified_status"=>"1"}
{"id"=>"8ee93dc5-abd3-4cdd-ad20-29fcf1168a66", "optimized_nickname"=>"Grand Vin 2", "optimized_country_id"=>"1", "season_id"=>"8ee93dc5-abd3-4cdd-ad20-29fcf1168a66", "verified_status"=>"1"}
{"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"Grand Vin 3", "optimized_country_id"=>"1", "season_id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "verified_status"=>"1"}
{"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"Grand Vin", "optimized_country_id"=>"1", "season_id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "verified_status"=>"1"}

過濾條件:

  • id字段與另一個 hash 相同時

  • 並且字段optimize_nicknameoptimize_country_id具有不同的值

  • 不要碰第一個 hash 響應這兩個條件

  • 修改響應這 2 個條件的所有其他哈希:將其已驗證狀態字段設置為 0,除非之前的 hash 已經verified_status=0

我想為這個用例獲得什么:

{"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"Grand Vin", "optimized_country_id"=>"1", "season_id"=>"a9840059-cc91-47aa-9098-4bf8a45655e7", "verified_status"=>"1"}
{"id"=>"8ee93dc5-abd3-4cdd-ad20-29fcf1168a66", "optimized_nickname"=>"Grand Vin 2", "optimized_country_id"=>"1", "season_id"=>"8ee93dc5-abd3-4cdd-ad20-29fcf1168a66", "verified_status"=>"1"}
{"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"Grand Vin 3", "optimized_country_id"=>"1", "season_id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "verified_status"=>"0"}
{"id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "optimized_nickname"=>"Grand Vin", "optimized_country_id"=>"1", "season_id"=>"f00b5b20-0250-4e0d-8a05-c70905030a32", "verified_status"=>"1"}

在第三個 hash 中, verified_status字段已設置為 0,因為它的值與第一個 hash 不同(因為它們具有相同的 id)。

我想我需要使用.map 或.select,但不知道如何檢查值。 謝謝。

如果您的哈希在名為“列表”的數組中,您可以簡單地掃描數組並按 id 收集項目以比較和更新后續項目。

first_items_by_id = Hash.new

list.each do |item|
    prev = first_items_by_id[item["id"]]
    item["verified_status"] = "0" if prev and ((item["optimized_nickname"] != prev["optimized_nickname"]) || (item["optimized_country_id"] != prev["optimized_country_id"]))
    first_items_by_id[item["id"]] = item if prev.nil?
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM