You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将哈希中的子数组映射为独立哈希条目?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

关键说明

  1. 符号键修正:原始数据使用的是符号键(如:dealer_id),避免写成字符串键('dealer_id')导致取值错误。
  2. zip方法的作用:[a,b,c].zip([x,y,z])会返回[[a,x], [b,y], [c,z]],完美实现价格与配置包的对应配对。
  3. 合并哈希:用base_attrs.merge(...)复用基础属性,减少重复代码。
  4. 无分支处理:无论子数组是单个还是多个元素,zip都能正确处理,无需单独写if-else分支。

内容的提问来源于stack exchange,提问作者random_user_0891

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:10:48