代码之家  ›  专栏  ›  技术社区  ›  Flávio

基于另外两个生成数组

  •  0
  • Flávio  · 技术社区  · 1 年前

    我有两个数组:

    [["106373", "106374", "106375", "106376"], ["106377", "106378", "220183", "220184"], ["220185", "220186", "220187", "220188"], ["220189", "220190", "106379"]]
    
    [["106373", 15],
     ["106374", 16],
     ["106375", 17],
     ["106376", 18],
     ["106377", 19],
     ["106378", 20],
     ["106379", 77],
     ["220183", 38],
     ["220184", 39],
     ["220185", 40],
     ["220186", 41],
     ["220187", 42],
     ["220188", 43],
     ["220189", 44],
     ["220190", 76]]
    

    我需要的是返回一个数组,该数组等于第一个数组,但第二个数组中的项被具有相同值的数字替换。预期结果:

    [[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]
    

    我用select和map等方法尝试了很多循环,但都没有成功。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Dogbert    1 年前

    首先,将第二个列表转换为哈希,以加快查找速度。然后在原始列表上调用map两次并查找值:

    lists = [["106373", "106374", "106375", "106376"], ["106377", "106378", "220183", "220184"], ["220185", "220186", "220187", "220188"], ["220189", "220190", "106379"]]
    
    mapping = [
      ["106373", 15],
      ["106374", 16],
      ["106375", 17],
      ["106376", 18],
      ["106377", 19],
      ["106378", 20],
      ["106379", 77],
      ["220183", 38],
      ["220184", 39],
      ["220185", 40],
      ["220186", 41],
      ["220187", 42],
      ["220188", 43],
      ["220189", 44],
      ["220190", 76]
    ]
    
    hash = mapping.to_h
    
    p lists.map { |list| list.map { hash[_1] } }
    

    输出

    [[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]
    

    注意:如果映射中不存在某个值,则在结果输出中会得到nil。

        2
  •  1
  •   potashin    1 年前

    您也可以使用 assoc 在不转换的情况下实现相同的结果 mapping 散列(请记住,中总是有相应的值 映射 ):

    lists = [["106373", "106374", "106375", "106376"], ["106377", "106378", "220183", "220184"], ["220185", "220186", "220187", "220188"], ["220189", "220190", "106379"]]
    mapping = [["106373", 15], ["106374", 16], ["106375", 17], ["106376", 18], ["106377", 19], ["106378", 20], ["106379", 77], ["220183", 38],["220184", 39], ["220185", 40], ["220186", 41], ["220187", 42], ["220188", 43], ["220189", 44], ["220190", 76]]
    
    lists.map { |list| list.map { mapping.assoc(_1)[1]  }  }
    # => [[15, 16, 17, 18], [19, 20, 38, 39], [40, 41, 42, 43], [44, 76, 77]]