如何从指定索引处的数组中删除元素,但不能就地执行操作

时间:2017-04-04 19:29:32

标签: arrays ruby element

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"]

如何从指定索引处的数组中删除元素但不执行该操作?

2 个答案:

答案 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"]

另一种方法是将rejectwith_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]