arrays - 当唯一 ID 匹配时,将键值对添加到哈希数组

标签 arrays ruby hash

我有两个哈希数组

sent_array = [{:sellersku=>"0421077128", :asin=>"B00ND80WKY"},
{:sellersku=>"0320248102", :asin=>"B00WTEF9FG"}, 
{:sellersku=>"0324823180", :asin=>"B00HXZLB4E"}]

active_array = [{:price=>39.99, :asin1=>"B00ND80WKY"}, 
{:price=>7.99, :asin1=>"B00YSN9QOG"}, 
{:price=>10, :asin1=>"B00HXZLB4E"}]

我想循环遍历sent_array,并找到active_array中:asin中的值等于:asin1中的值的位置,然后将:price的键和值复制到sent_array。结果是这样的:

final_array = [{:sellersku=>"0421077128", :asin=>"B00ND80WKY", :price=>39.99},
{:sellersku=>"0320248102", :asin=>"B00WTEF9FG"}, 
{:sellersku=>"0324823180", :asin=>"B00HXZLB4E", :price=>10}]

我尝试了这个,但我得到了一个类型错误 - 没有将符号隐式转换为整数(类型错误)

sent_array.each do |x|
 x.detect { |key, value| 
  if value == active_array[:asin1]
    x[:price] << active_array[:price]
  end
 }
end

最佳答案

出于效率和可读性的考虑,首先在 active_array 上构建查找哈希是有意义的:

h = active_array.each_with_object({}) { |g,h| h[g[:asin1]] = g[:price] } 
  #=> {"B00ND80WKY"=>39.99, "B00YSN9QOG"=>7.99, "B00HXZLB4E"=>10}

我们现在只需单步执行sent_array,更新哈希值:

sent_array.each { |g| g[:price] = h[g[:asin]] if h.key?(g[:asin]) }
  #=> [{:sellersku=>"0421077128", :asin=>"B00ND80WKY", :price=>39.99},
  #    {:sellersku=>"0320248102", :asin=>"B00WTEF9FG"}, 
  #    {:sellersku=>"0324823180", :asin=>"B00HXZLB4E", :price=>10}] 

当然,从哈希 (h) 中检索键值对比在哈希数组中搜索键值对要快得多。

关于arrays - 当唯一 ID 匹配时,将键值对添加到哈希数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31035567/

相关文章:

php - 将PHP数组格式转换为js数组格式,仅使用js

ruby - cgi 中 ruby​​ 中的换行符

c - 用于散列 ip 片段的散列函数

python - numpy 将数组作为一个整体进行比较

c - fscanf 不读入数组

ruby - "resources"- ruby​​ gem 目录

Ruby/Watir 在使用 "goto"后卡住了

ruby - 具有默认值的 Rails 嵌套哈希

javascript - 使用 jQuery 在特定点加载页面(没有动画!)

arrays - $elemMatch 运算符在 mongodb 中无法正常工作