我从一个API获取数据,需要用不同的格式。我有一个car_array
,它由一个哈希数组组成。但是,有时会有一个子数组作为哈希值之一,其中包含多个元素。在这种情况下,应该有一个循环,以便数组中的每个元素都正确地Map为单独的条目。
数据示例,请注意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']
}]
我想在有多个数组元素时创建多个条目
例如,上面的数据应分解并Map为:
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' }
]
这是我目前得到的结果:
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
4条答案
按热度按时间ufj5ltwl1#
考虑从一个散列开始,以及如何解决这个更简单的问题。
让我们使用
#zip
获得价格和选项包的组合。这个数组的长度
3
对应于我们期望从中得到多少个哈希值,所以让我们Map这些值,每次都构建一个新的哈希值。现在,您只需要在阵列上执行
#flat_map
操作即可。ccrfmcuu2#
如果
arr
是问题中给出的散列数组,则可以写如下。请注意,如果将键值对添加到散列中,或者删除或重命名键
:dealer_id
和:dealer_name
,则不需要更改此代码。7fhtutme3#
我的答案是answer of Chris上的扩展。
如果您使用的是最新的Ruby版本,这个答案可能会缩短。
Ruby 3.0引入了
Hash#except
,它可以让你轻松地创建一个没有指定键的哈希值的副本。car.except(:prices)
将创建一个没有:prices
键/值对的新散列,我们不需要移除:options_package
,因为merge
将用新值覆盖旧的:options_package
值。Ruby 3.1引入了
{ x:, y: }
作为{ x: x, y: y }
的语法糖。这允许我们进一步“简化”答案:rhfm7lfc4#
输入
编码
输出量