2017-08-29 71 views
0

我有这个哈希的误差值提取哈希

obj= {"User"=>["user_error", "Jack", "Jill1"], "Project"=>[ "project_error", "xxx"], "Task"=>[39], "Date"=>"date_error", "Time (Hours)"=>["time_error", "-2"], "Comment"=>"comment_error"} 

我要提取键的误差值,并将其存储其他地方 .The最终结果应该是

error = ["user_error", "project_error","date_error","time_error","comment_error"] 


obj = {"User"=>["Jack", "Jill1"], "Project"=>[ "xxx"], "Task"=>[39], "Date"=>nil, "Time (Hours)"=>["-2"], "Comment"=>nil} 

有人可以帮助如何做到这一点?

+1

你有什么迄今所做?告诉我们你的代码。 –

回答

1

不算漂亮,但你可以做这样的事情:

errors = obj.each_with_object([]) do |(k, v), err| 
    if v.is_a?(Array) && v.first =~ /_error$/ 
    err << v.shift 
    elsif v =~ /_error$/ 
    err << v 
    obj[k] = nil 
    end 
end 

结果:

errors 
#=> ["user_error", "project_error", "date_error", "time_error", "comment_error"] 

obj 
#=> {"User"=>["Jack", "Jill1"], "Project"=>["xxx"], "Task"=>[39], "Date"=>nil, "Time (Hours)"=>["-2"], "Comment"=>nil} 

你可以通过将所有值转换为DRY代码第一阵列,但你会得到空数组来代替nilDateComment键:

errors = obj.each_with_object([]) do |(k, v), err| 
    obj[k] = v = [v].flatten 
    err << v.shift if v.first =~ /_error$/ 
end 

errors 
#=> ["user_error", "project_error", "date_error", "time_error", "comment_error"] 

obj 
#=> {"User"=>["Jack", "Jill1"], "Project"=>["xxx"], "Task"=>[39], "Date"=>[], "Time (Hours)"=>["-2"], "Comment"=>[]} 
0

你可以做到以下几点:

errors = [] 
obj.map do |class_name, strings| 
    errors.push(strings.shift) # shift remove the first element of the array 
    obj[class_name] = strings 
end