我从SQL查询中得到了items
的结果。我想使用这些结果来创建一个名为products
的新散列数组。我走的路好像不对。在对每一行进行迭代时,我需要有条件地处理行中的一些键,例如下面的伪代码。
items = retrieve_items_from_db
products = items.map do |row|
{
row.each do | k, v|
if k == "Color"
#go do something and add updated key, value pair to products
else puts "SKEY:#{k} VALUE: #{v}"
# add k,v to products
k => v
end
}
end
有什么建议吗?我试过使用inject({})
而不是map
。
您在这里尝试做的事情很酷,但我们不能将条件语句放在散列中。
即你不能做:
{
if 2 == 2
math: "correct"
else
math: "incorrect"
end
}
你需要做的是:
if 2 == 2
{ math: "correct" }
else
{ math: "incorrect" }
end
如果需要将多个散列合并为一个散列,Hash#merge
方法非常有用。
例如:
{ a: "a", b: "DEFAULT" }.merge({ b: "b", c: "c" })
# => { a: "a", b: "b", c: "c" }
您可以看到第二个散列已经覆盖了第一个散列中的值。
您可以在这里使用inject
(或reduce
,它做同样的事情,但听起来不那么可怕),但由于您要将数组转换为数组,因此使用map
会更容易。
products = items.map do |row|
if row.keys.include?(:price)
row = row.merge(price: "#{row[:price]} dollars")
else
row = row.merge(price: "not available for sale")
end
next row
end
使其成为嵌套映射,然后进行扁平化:
products = items.map do |row|
row.map do |k, v|
if k == "Color"
# go do something
# add transformed k, v to products
else
puts "SKEY:#{k} VALUE: #{v}"
k => v # add k, v to products
end
end
end.flatten
我认为这种方式读起来最简单:
items = retrieve_items_from_db
products = items.map do |row|
product = {}
row.each do | k, v|
if k == "Color"
#go do something and add updated key, value pair to products
product[transform_key(k)] = transform_value(v)
else
puts "SKEY:#{k} VALUE: #{v}"
# add k,v to products
product[k] = v
end
end
product
end
您也可以使用Hash::[]将数组对的数组转换为Hash,但对我来说,这更麻烦:
items = retrieve_items_from_db
products = items.map do |row|
Hash[row.map do | k, v|
if k == "Color"
#go do something and add updated key, value pair to products
[transform_key(k), transform_value(v)]
else
puts "SKEY:#{k} VALUE: #{v}"
# add k,v to products
[k, v]
end
end]
end