Ruby创建哈希数组:如何用变量作哈希键操作嵌套数组?
解决思路:换用哈希才是正确的打开方式
我懂你现在卡在哪啦!你的核心问题是选错了数据结构——你现在用数组来存客户数据,但其实你要的是哈希啊!因为你想通过客户ID(比如c1001)直接定位对应的记录,数组是按索引访问的,根本没法用custArray[:c1001]这种方式查找,这才导致你陷入困境~
第一步:重构数据结构
把原来的custArray换成哈希,让客户ID作为键,这样就能快速定位到对应的客户购买记录:
# 初始化空的客户哈希,键是客户ID,值是包含purchases数组的哈希 cust_hash = {}
第二步:实现你要的逻辑
我们可以写一个简单的方法来封装“判断客户是否存在,存在则追加商品,不存在则创建新条目”的逻辑,这样复用性更强:
def add_purchase(cust_hash, customer_id, product_id) # 技巧:如果客户ID不存在,就自动初始化一个带空purchases数组的哈希 cust_hash[customer_id] ||= { "purchases" => [] } # 往该客户的购买列表里追加新商品 cust_hash[customer_id]["purchases"] << product_id end
调用示例
看看实际使用的效果:
# 初始化客户哈希 cust_hash = {} # 给c1001添加第一个商品 add_purchase(cust_hash, "c1001", "prod01") puts cust_hash.inspect # 输出:{"c1001"=>{"purchases"=>["prod01"]}} # 给已存在的c1001添加第二个商品 add_purchase(cust_hash, "c1001", "prod02") puts cust_hash.inspect # 输出:{"c1001"=>{"purchases"=>["prod01", "prod02"]}} # 给新客户c1002添加商品 add_purchase(cust_hash, "c1002", "prod03") puts cust_hash.inspect # 输出:{"c1001"=>{"purchases"=>["prod01", "prod02"]}, "c1002"=>{"purchases"=>["prod03"]}}
如果你非要坚持用数组(不推荐)
如果因为某些原因必须用数组存储,那只能通过遍历数组查找对应的客户条目,这种方式效率较低(客户越多越慢),代码如下:
custArray = [] custArray << {"c1001" => {"purchases" => ["prod01"]}} # 遍历数组,找到包含c1001的条目 customer_entry = custArray.find { |item| item.key?("c1001") } if customer_entry # 存在则追加商品 customer_entry["c1001"]["purchases"] << "prod02" else # 不存在则添加新条目 custArray << {"c1001" => {"purchases" => ["prod02"]}} end puts custArray.inspect # 输出:[{"c1001"=>{"purchases"=>["prod01", "prod02"]}}]
总结
用哈希是最优解,因为键值对的查找是O(1)的常数时间,而数组遍历是O(n)的线性时间,当客户数量多了之后,性能差距会非常明显。
内容的提问来源于stack exchange,提问作者Toph
相关产品推荐
相关产品推荐

