Ruby 2.4。我想通过从数组中删除指定索引处的元素来创建新数组。我认为delete_at
是这样的,但是它就地执行并且不会返回新创建的数组,而是返回被删除的元素:
2.4.0 :003 > a = ["a", "b", "c"]
=> ["a", "b", "c"]
2.4.0 :004 > a.delete_at(0)
=> "a"
2.4.0 :005 > a
=> ["b", "c"]
如何从指定索引处的数组中删除元素但不执行该操作?
答案 0 :(得分:4)
您可以复制数组并从此副本中删除元素。使用tap
返回数组,但不是已删除的元素。
2.3.3 :018 > a = ["a", "b", "c"]
=> ["a", "b", "c"]
2.3.3 :019 > b = a.dup.tap{|i| i.delete_at(0)}
=> ["b", "c"]
2.3.3 :020 > b
=> ["b", "c"]
另一种方法是将reject
与with_index
:
2.3.3 :042 > b = a.reject.with_index{|v, i| i == 0 }
=> ["b", "c"]
2.3.3 :043 > b
=> ["b", "c"]
答案 1 :(得分:1)
您希望创建一个与给定数组相同的新数组,而不是给定索引处的元素。
您可以使用Array#[](又名Array#slice)和Array#concat。
def copy_wo_element(arr, index_to_exclude)
arr[0,index_to_exclude].concat(arr[index_to_exclude+1..-1])
end
arr = [1,2,3,4,5]
copy_wo_element(arr, 0)
#=> [2, 3, 4, 5]
copy_wo_element(arr, 1)
#=> [1, 3, 4, 5]
copy_wo_element(arr, 2)
#=> [1, 2, 4, 5]
copy_wo_element(arr, 3)
#=> [1, 2, 3, 5]
copy_wo_element(arr, 4)
#=> [1, 2, 3, 4]
你可以写
arr[0,index_to_exclude] + arr[index_to_exclude+1..-1]
但使用concat
可以避免创建临时数组arr[index_to_exclude+1..-1]
。