只需使用.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 –