我试图检查一个二维数组的第一个值是否有我正在测试的值。数组是这样的
[[2,5],[3,1],[4,1]]
我想只检查数组的第一个成员(这里是2或3或4)我对一维数组做了类似的操作,但对二维数组不起作用
[:cart] << [id, 1] unless [:cart].include?(id)
wydwbb8l1#
您可以使用any? Escort函数来实现这一点,如下所示
any?
[:cart] << [id, 1] unless [:cart].any? {|arr| arr[0] == id}
uqzxnwby2#
你可以使用assoc来根据第一个值找到一个子数组:
assoc
array = [[2, 5], [3, 1], [4, 1]] array.assoc(3) #=> [3, 1]
同样,它可以用于条件:
array << [id, 1] unless array.assoc(id)
注意assoc必须遍历数组才能找到子数组。如果你的集合很大,哈希可能更合适。
pu82cl6c3#
当数据要求嵌套数组的第一个值是唯一的时,嵌套数组可能不是适合您的数据结构。我建议使用Hash:
Hash
cart = { 2 => 5, 3 => 1, 4 => 1 } cart[id] = 1 unless cart.key?(id)
在这种情况下,在嵌套数组上使用哈希的最大好处是,检查特定键是否已经在哈希中更高效(O(1)),而不是迭代数组(O(n))。当值总是数字而不是像false或nil这样的值时,代码可以进一步简化为(正如mechanicov在评论中指出的那样):
O(1)
O(n)
false
nil
cart = { 2 => 5, 3 => 1, 4 => 1 } cart[id] ||= 1
cart[id] ||= 1仅在cart[id]尚未返回true值时,才将1分配给由变量id定义的键。
cart[id] ||= 1
cart[id]
1
id
ztigrdn84#
您可以将第一个数字提取到一维数组中,并使用当前逻辑。
first_items = arrays.map { |sub_array| sub_array[0] }
ukqbszuj5#
pattern matching是什么意思
def add_to_cart_if_absent(cart, id) case cart in [*, [^id, _], *] cart # return same value if match else cart + [[id, 1]] # return new array with added element end end
*是查找模式的splat运算符^是pin操作符,用于使用模式中的现有变量使用_是因为我们不关心第二个元素当id存在时:
*
^
_
cart = [[2, 5], [3, 1], [4, 1]] id = 3 add_to_cart_if_absent(cart, id) # => [[2, 5], [3, 1], [4, 1]]
当id不存在时:
cart = [[2, 5], [3, 1], [4, 1]] id = 33 add_to_cart_if_absent(cart, id) # => [[2, 5], [3, 1], [4, 1], [33, 1]]
5条答案
按热度按时间wydwbb8l1#
您可以使用
any?
Escort函数来实现这一点,如下所示uqzxnwby2#
你可以使用
assoc
来根据第一个值找到一个子数组:同样,它可以用于条件:
注意
assoc
必须遍历数组才能找到子数组。如果你的集合很大,哈希可能更合适。pu82cl6c3#
当数据要求嵌套数组的第一个值是唯一的时,嵌套数组可能不是适合您的数据结构。
我建议使用
Hash
:在这种情况下,在嵌套数组上使用哈希的最大好处是,检查特定键是否已经在哈希中更高效(
O(1)
),而不是迭代数组(O(n)
)。当值总是数字而不是像
false
或nil
这样的值时,代码可以进一步简化为(正如mechanicov在评论中指出的那样):cart[id] ||= 1
仅在cart[id]
尚未返回true值时,才将1
分配给由变量id
定义的键。ztigrdn84#
您可以将第一个数字提取到一维数组中,并使用当前逻辑。
ukqbszuj5#
pattern matching是什么意思
*
是查找模式的splat运算符^
是pin操作符,用于使用模式中的现有变量使用
_
是因为我们不关心第二个元素当
id
存在时:当
id
不存在时: