只需使用.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 个随机元素
每个移除元素后的累积执行时间
过滤方法
- 197 毫秒
- 422ms
- 626 毫秒
- 847ms
- 1087ms
拼接方法
- 33 毫秒
- 83 毫秒
- 142 毫秒
- 198 毫秒
- 255ms
拼接和indexOf方法
- 27 毫秒
- 70ms
- 88ms
- 116 毫秒
- 134 毫秒
测试代码 - 又快又脏(不考虑随机选择两次相同的值):
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/