2014-03-26 122 views
1

我有一个对象数组,我想通过其索引删除一个值。我有一个方法,对此要删除传递的价值,即认定传递的参数值:Coffeescript通过索引删除数组值

remove: (val) -> 
    for el, index in @arr 
    if el is val 
     # remove el from @arr... 

CoffeeScript website说,十分清楚地表明,以取代我想要的元素,我必须做@arr[index] = 'something',但没有什么是完全消除它的说法。

回答

0

的文档提供了使用过滤器的例子,所以也许你可以试试?:

remove: (val) -> @arr = (x for x in @arr when x isnt val) 
+0

这不仅会创建整个数组的第二个内存中副本(减1个元素),还会遍历所有元素,而不是仅仅删除必须删除的元素。另外,它需要3倍的代码,创建4个新的变量和一个匿名函数。 –

+1

真的让我想起这件事:http://i.stack.imgur.com/ssRUr.gif –

3

只需使用.splice()

for index, elem in @arr 
    @arr.splice index, 1 if elem is val 

如果你不关心Internet Explorer 7或8,可以简化甚至更多:

@arr.splice @arr.indexOf(val), 1 

这假定元素存在于该数组,否则它会删除最后一个元素。如果你需要检查它是否存在,你可以使用一个小窍门:

@arr.splice (@arr.indexOf(val)+1 or @arr.length+1)-1, 1

相比“只有咖啡”过滤解决方案,你会得到4-8倍的性能提升(在Chrome中):

从10.000的数组中删除5个随机元素。000整数

每个删除的元素

滤波器方法

  • 197ms
  • 422ms
  • 626ms
  • 847ms
  • 1087ms
  • 后累积执行时间

拼接方法

  • 为33ms
  • 83ms
  • 142ms
  • 198ms
  • 255毫秒

接头和方法的indexOf

  • 27ms
  • 70ms的
  • 88ms
  • 116ms
  • 134ms

测试代码 - 快速和肮脏的(不考虑随机选择的相同值的两倍):

log "coffee method" 
arr = [0..9999999] 
length = arr.length 
start = new Date().getTime() 
for num in [1..5] 
    val = Math.round(Math.random() * length) 
    do (val) -> arr = (x for x in arr when x isnt val) 
    log new Date().getTime()-start+"ms" 

log "splice method" 
arr = [0..9999999] 
length = arr.length 
start = new Date().getTime() 
for num in [1..5] 
    val = Math.round(Math.random() * length) 
    for index, elem in arr 
     arr.splice index, 1 if elem is val 
    log new Date().getTime()-start+"ms" 

log "splice method with indexOf()" 
arr = [0..9999999] 
length = arr.length 
start = new Date().getTime() 
for num in [1..5] 
    val = Math.round(Math.random() * length) 
    arr.splice arr.indexOf(val), 1 
    log new Date().getTime()-start+"ms" 

演示: http://jsfiddle.net/j9CZz/1/

+0

目前,我用'.splice'做到这一点。这是JavaScript的方式。我只想要更多的CoffeeScript方法。 – abpetkov

+2

但coffeescript使用Javascript ...?无论你在咖啡中做什么,最终都会得到JS,所以最好的性能和最自然的事情就是使用原生JS解决方案。 –

+0

你可以从javascript数组中删除一个元素,同时迭代它呢? – 2014-03-26 11:36:30