2014-03-26 157 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