在 Ruby 中,在数组迭代期间,如何将多个数组元素作为一个特定哈希键的值发送?

In Ruby, during iteration of an array, how do I send multiple array elements as values for one specific hash key?

我知道如何遍历数组,我知道如何创建散列键和值。我不知道如何为该值创建一个数组并将多个元素传递给它。我对下面 hash 的期望值是: {'abc' => [1, 2, 3] , 'def' => [4,5,6,7]}

在使用 each 遍历下面的数组 ab 时,我将如何实现此散列?

a = [1,2,3,4,5,6,7]
c = [1,2,3]
b = ['abc', 'def']

hash = {}

根据您在评论中给出的指南:

While iterating through array a, if the element of iteration is included in array c, it is passed to the array value within key 'abc'. Otherwise, it is passed to other array value in key 'def'

你可以这样做:

hash = {}
hash['abc'] = a.select { |x| c.include?(x) }
hash['def'] = a.reject{ |x| c.include?(x) }

参见 Enumerable#select and Enumerable#reject. Also can take a look at Enumerable#partition 这将是另一个不错的选择,您希望根据某些条件将一个数组拆分为两个数组:

in_a, not_in_a = a.partition { |x| c.include?(x) }
hash = { 'abc' => in_a, 'def' => not_in_a }

如果这些奇特的可枚举方法对您来说有点太多了,您也可以使用常规 each 来完成:

hash = { 'abc' => [], 'def' => [] }

a.each do |x|
  if c.include?(x)
    hash['abc'].push(x)
  else
    hash['def'].push(x)
  end
end

不幸的是,这个问题并没有我希望的那么有趣。我希望问题是这样的:

知道哈希键和值后,如何确保键的值是一个数组并且给定值附加到该数组?

例如,从 h 开始为 {}。我有一个键名 :k 和一个值 1。我希望 h[:k],如果尚不存在,则为 [1]。但如果它已经存在,那么它就是一个数组,我想将 1 附加到该数组;例如,如果 h[:k] 已经是 [3,2],现在应该是 [3,2,1].

我可以想出各种方法来确保这一点,但一种可能性是:

(hash[key] ||= []) << value

要看它是否有效,让我们把它变成一个方法:

def add_to_hash_array_value(hash:, key:, value:)
  (hash[key] ||= []) << value
end

现在我会多次调用它:

h = {}
add_to_hash_array_value(hash:h, key:"abc", value:1)
add_to_hash_array_value(hash:h, key:"abc", value:2)
add_to_hash_array_value(hash:h, key:"def", value:4)
add_to_hash_array_value(hash:h, key:"def", value:5)
add_to_hash_array_value(hash:h, key:"abc", value:3)
puts h #=> {"abc"=>[1, 2, 3], "def"=>[4, 5]}

我们答对了。

这很好,因为假设我有一些方法可以知道给定一个值,它应该附加到哪个键。我可以重复应用该决策过程。

然而,尝试将其应用于原始问题的麻烦在于,原始问题似乎并不完全如何决定,给定一个值,它应该附加到什么 键。