Ruby中的Array.prototype.splice

时间:2011-07-31 21:50:45

标签: javascript ruby

一位朋友问我Ruby在Ruby中实现JavaScript splice方法效果的最佳和最佳方式。 这意味着不会对阵列本身或副本进行迭代。

“从索引开始处开始,删除长度项目和(可选)插入元素。最后在数组中返回已删除的项目。” << 这是误导性的,请参阅下面的JS示例。

http://www.mennovanslooten.nl/blog/post/41

没有可选替换的快速黑客:

from_index     = 2
for_elements   = 2
sostitute_with = :test
initial_array  = [:a, :c, :h, :g, :t, :m]
# expected result: [:a, :c, :test, :t, :m]
initial_array[0..from_index-1] + [sostitute_with] + initial_array[from_index + for_elements..-1]

你的是什么? 一条线更好。

更新

// JavaScript
var a = ['a', 'c', 'h', 'g', 't', 'm'];
var b = a.splice(2, 2, 'test'); 
> b is now ["h", "g"]
> a is now ["a", "c", "test", "t", "m"]

我需要生成的'a'数组,而不是'b'。

2 个答案:

答案 0 :(得分:7)

使用Array#[]=

a = [1, 2, 3, 4, 5, 6]
a[2..4] = [:foo, :bar, :baz, :wibble]
a # => [1, 2, :foo, :bar, :baz, :wibble, 6]

# It also supports start/length instead of a range:
a[0, 3] = [:a, :b]
a # => [:a, :b, :bar, :baz, :wibble, 6]

至于返回删除的元素,[]=不会这样做......你可以编写自己的帮助方法来执行此操作:

class Array
  def splice(start, len, *replace)
    ret = self[start, len]
    self[start, len] = replace
    ret
  end
end

答案 1 :(得分:3)

首先使用slice!提取要删除的部分:

a   = [1, 2, 3, 4]
ret = a.slice!(2,2)

[1,2]中的a[3,4]中的ret。然后是一个简单的[]=来插入新值:

a[2,0] = [:pancakes]

结果是[3,4]中的ret[1, 2, :pancakes]中的a。泛化:

def splice(a, start, len, replacements = nil)
    r = a.slice!(start, len)
    a[start, 0] = replacements if(replacements)
    r
end

如果您想要可变行为,也可以使用*replacements

def splice(a, start, len, *replacements)
    r = a.slice!(start, len)
    a[start, 0] = replacements if(replacements)
    r
end

使用startlen进行修补并确定您想要解决的有关出界问题的内容是留作练习。