Coffeescript按索引删除数组值

时间:2014-03-26 11:07:00

标签: javascript arrays coffeescript

我有一个对象数组,我想通过索引删除一个值。我有一个方法,要传递的值被传递,找到传递的参数值:

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

CoffeeScript website非常明确地说,为了替换我想要的元素,我必须做@arr[index] = 'something',但没有说完全删除它。

2 个答案:

答案 0 :(得分: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.000整数的数组中删除5个随机元素

     

每个已删除元素后的累积执行时间

     

过滤方法

     
      
  • 197ms
  •   
  • 422ms
  •   
  • 626ms
  •   
  • 847ms
  •   
  • 1087ms
  •   
     

拼接方法

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

splice和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/

答案 1 :(得分:0)

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

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