对sql结果进行迭代以生成新的散列数组

  • 本文关键字:数组 结果 sql 迭代 ruby
  • 更新时间 :
  • 英文 :


我从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

最新更新