只需使用.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/
這不僅會創建整個數組的第二個內存中副本(減1個元素),還會遍歷所有元素,而不是僅僅刪除必須刪除的元素。另外,它需要3倍的代碼,創建4個新的變量和一個匿名函數。 –
真的讓我想起這件事:http://i.stack.imgur.com/ssRUr.gif –