Ruby按键值连接两个数组

时间:2017-09-05 18:30:22

标签: arrays ruby

我有两个数组,第一个数组包含字段名,类型和ID。

arr1 = [
    {
        "n" => "cat",
        "t" => 0,
        "id" => "42WTd5"
    },
    {
        "n" => "dog",
        "t" => 0,
        "id" => "1tM5T0"
    }
]

第二个数组包含字段,id和值。

arr2 = [
    {
        "42WTd5"=>"meow",
        "1tM5T0"=>"woof"
    }
]

如何通过id加入它们以产生以下结果。

cat: meow
dog: woof

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我认为你希望你的结果是哈希,在这种情况下,这将完成工作:

def match_animals_to_sounds(animal_array, sound_array)
  sounds = sound_array.first
  animal_array.map { |animal| [animal['n'], sounds[animal['id']]] }.to_h
end

>> match_animals_to_sounds(arr1, arr2)
=> {"cat"=>"meow", "dog"=>"woof"}

你的arr2很不寻常,因为它是一个单个元素的数组。我只是在上面调用#first来取出里面的哈希。如果您希望将来某个版本的此阵列有多个元素,您需要重新考虑此方法的第一行。

第二行是标准的Ruby Array操作。第一部分将每只动物映射到一个包含每个动物名称和声音的新元素阵列。最后,#to_h将这个双元素数组数组转换为单个Hash,这比字符串数组更有用。我不知道你在问题中的意图,但这可能就是你想要的。

如果您更喜欢使用符号,则可以将方法的第二行更改为:

animal_array.map { |animal| [animal['n'].to_sym, sounds[animal['id']].to_sym] }.to_h

在这种情况下,您将获得:

>> match_animals_to_sounds(arr1, arr2)
=> {:cat=>:meow, :dog=>:woof}

答案 1 :(得分:0)

这是一种方法。

sounds = arr2[0]
results = arr1.map do |animal|
  "#{animal["n"]}: #{sounds[animal["id"]]}"
end
puts results
# => cat: meow
# => dog: woof

似乎第二个数组应该只是一个哈希。如果只有一个元素并且该数字不会改变,那么创建一个数组毫无意义。

毫无意义的单行(不要使用这个)

puts arr1.map { |x| "#{x["n"]}: #{arr2[0][x["id"]]}" }

答案 2 :(得分:0)

您还可以通过以下代码获取联接结果

arr1.collect{ |a| {a["n"] => arr2[0][a["id"]]} }