如何将哈希中的子数组映射为独立哈希条目?API数据格式化需求
处理汽车数组中子数组的展开映射问题
问题描述
从API获取的car_array数组由哈希组成,其中prices和options_package字段是包含多个元素的子数组,需要将每个子数组的对应元素映射为独立的哈希条目,实现类似如下的转换:
原始数据示例
[ { dealer_id: 1, dealer_name: "dealership 1", car_make: "jeep", prices: ['30', '32', '35'], options_package: ['A', 'B', 'C'] }, { dealer_id: 2, dealer_name: "dealership 2", car_make: "ford", prices: ['50', '55'], options_package: ['X', 'Y'] }, { dealer_id: 3, dealer_name: "dealership 3", car_make: "dodge", prices: ['70'], options_package: ['A'] } ]
期望输出
some_array = [ { dealer_id: 1, dealer_name: "dealership 1", car_make: "jeep", price: '30', options_package: 'A' }, { dealer_id: 1, dealer_name: "dealership 1", car_make: "jeep", price: '32', options_package: 'B' }, { dealer_id: 1, dealer_name: "dealership 1", car_make: "jeep", price: '35', options_package: 'C' }, { dealer_id: 2, dealer_name: "dealership 2", car_make: "ford", price: '50', options_package: 'X' }, { dealer_id: 2, dealer_name: "dealership 2", car_make: "ford", price: '55', options_package: 'Y' }, { dealer_id: 3, dealer_name: "dealership 3", car_make: "dodge", price: '70', options_package: 'A' } ]
现有代码存在options_package与price无法对应匹配的问题,且分支处理冗余:
car_arr.each do |car| if car['Prices'].length > 1 # if there are multiple prices/options loop through each one and create a new car car.each do |key, value| if key == 'Prices' value.each do |price| formatted_car_array << { dealer_id: car['dealer_id'], dealer_name: car['dealer_name'], car_make: car['make'], options_package: ???????, price: price, } end end end else # there's only element for price and options_package formatted_car_array << { dealer_id: car['dealer_id'], dealer_name: car['dealer_name'], car_make: car['make'], options_package: car['options_package'], price: car['prices'] } end end
解决方案
核心思路是利用Ruby的zip方法将prices和options_package数组按索引配对,无需单独处理单元素分支,代码更简洁健壮:
formatted_car_array = [] car_array.each do |car| # 提取基础属性(注意原始数据用的是符号键,不要写成字符串键) base_attrs = { dealer_id: car[:dealer_id], dealer_name: car[:dealer_name], car_make: car[:car_make] } # 将prices和options_package按索引配对,遍历每一组配对生成新条目 car[:prices].zip(car[:options_package]).each do |price, option| formatted_car_array << base_attrs.merge({ price: price, options_package: option }) end end
关键说明
- 符号键修正:原始数据使用的是符号键(如
:dealer_id),避免写成字符串键('dealer_id')导致取值错误。 zip方法的作用:[a,b,c].zip([x,y,z])会返回[[a,x], [b,y], [c,z]],完美实现价格与配置包的对应配对。- 合并哈希:用
base_attrs.merge(...)复用基础属性,减少重复代码。 - 无分支处理:无论子数组是单个还是多个元素,
zip都能正确处理,无需单独写if-else分支。
内容的提问来源于stack exchange,提问作者random_user_0891
相关产品推荐
相关产品推荐

