新手问题 求助: Ruby 数组运用的问题

popmonker · 2016年06月06日 · 最后由 zfjoy520 回复于 2016年06月08日 · 2118 次阅读

我谢了一小段代码

@item_pack = []
@pack1 = []
model_pack = {:name => {},:modellist =>[]}
data_pack = {:model =>{},:date =>[] }

model_pack[:name] = 1
data_pack[:model] = "aaa"
model_pack[:modellist] << data_pack

model_pack[:name] = 2
data_pack[:model] = "bbb"
model_pack[:modellist] << data_pack


@item_pack << model_pack

puts "#{@item_pack}"

本来意图输出是

[{:name=>2, :modellist=>[{:model=>"aaa", :date=>[]}, {:model=>"bbb", :date=>[]}]}]

但是实际输出的是

[{:name=>2, :modellist=>[{:model=>"bbb", :date=>[]}, {:model=>"bbb", :date=>[]}]}]

请问问题点在哪里?新手求教

你可以理解为 data_pack 是个引用,你前面存入之后又对它的实际值做了修改

#1 楼 @u1455254865 谢谢回答,那我应该用什么方式才能得到我意图的数据呢?

@item_pack = []
@pack1 = []
model_pack = {:name => {},:modellist =>[]}
data_pack = {:model =>{},:date =>[] }

model_pack[:name] = 1
data_pack[:model] = "aaa"
model_pack[:modellist] << data_pack
data_pack = data_pack.dup
model_pack[:name] = 2
data_pack[:model] = "bbb"
model_pack[:modellist] << data_pack

@item_pack << model_pack
@item_pack = []
@pack1 = []
# 你的modellist要不要换成model_list……
model_pack = {name: nil, modellist: []}
data_pack = {model: nil,date: []}

model_pack[:name] = 1
data_pack[:model] = "aaa"
model_pack[:modellist] << data_pack.clone   # 传值代替传引用
model_pack[:name] = 2
data_pack[:model] = "bbb"
model_pack[:modellist] << data_pack

@item_pack << model_pack

puts @item_pack    # 不用放在引号里……

#3 楼 @rikiwong 谢谢!有效果。不胜感激!

#4 楼 @classicalliu 谢谢,有效果不胜感激。如果可以,我再问一个问题,确认我是不是走了弯路?

其实我从数据库中查找出以下的数据

人名 1,机种 1,日期 1 人名 1,机种 1,日期 2 人名 1,机种 1,日期 3 人名 1,机种 2,日期 4 人名 2,机种 2,日期 5

我就想把数据进行整理,整理成为 一个人名对应多个机种,每个机种下又是日期的集合。我就采用了提问时的写法。这样的方法是不是有点笨?还望指教一下。

假如有个表 List,我查到了数据 lists, 人名为 name, 机种为 model, 日期为 date

result = {}
lists.each do |list|
  if result[list.name].present?
    if result[list.name][list.model].present?
      result[list.name][list.model] << list.date
    else
      result[list.name][list.model] = []
      result[list.name][list.model] << list.date
    end
 else
    result[list.name] = {"#{list.model}" => date}
  end
end
result

@rikiwong @classicalliu 试了有效果,真是太感谢了。看来学习 ruby 的路还很长.... 不过目前提供的方法,虽然有用,但是我不知道怎么调用。因为做表格每行中的列显示 |人名 | 机种名 | 日期 1|日期 2|日期 3|这样子的,因此就需要取得 result 内对应的 name,所以就想显示成 [{:name=>2, :modellist=>[{:model=>"aaa", :date=>[]}, {:model=>"bbb", :date=>[]}]}] 能够调用字段 上面教的方法知己就输出了 {2=>{"aaa"=>[date1,date2]}}的方式,我就有点蒙了。

#9 楼 @popmonker 按照我提供的代码,自己改一改,那个代码只是提供了一个思路。活学活用哦!

#7 楼 @rikiwong @popmonker

result = lists.group_by(&:name).map do |name, models|
  [name, models.group_by(&:model).map do |model, dates|
    [model, dates.map(&:date).join(' ')]
  end.to_h]
end.to_h

这样可能更简单一些?

@rikiwong @msg7086 @classicalliu 终于知道怎么用了,也理解你们写的代码了,感谢帮助

上面的都是贴代码 这位小兄弟需要先明白什么是对象引用

#14 楼 @zhang_soledad 其实主要是楼主帖子里的代码 TL;DR 了所以……

ActiveRecord::Relation.pluck(:name, :model, :date).group_by(&:shift).transform_values { |x|
  x.group_by(&:shift).transform_values(&:flatten)
}
=> {"人名1"=>{"机种1"=>["日期1", "日期2", "日期3"], "机种2"=>["日期4"]}, "人名2"=>{"机种2"=>["日期5"]}}
需要 登录 后方可回复, 如果你还没有账号请 注册新账号