我有一个对象数组,我想通过索引删除一个值。我有一个方法,要传递的值被传递,找到传递的参数值:
remove: (val) ->
for el, index in @arr
if el is val
# remove el from @arr...
CoffeeScript website非常明确地说,为了替换我想要的元素,我必须做@arr[index] = 'something'
,但没有说完全删除它。
答案 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"
答案 1 :(得分:0)
文档提供了使用过滤器的示例,所以也许您可以试试?:
remove: (val) -> @arr = (x for x in @arr when x isnt val)