gpt4 book ai didi

javascript - Coffeescript 按索引删除数组值

转载 作者:行者123 更新时间:2023-11-30 12:45:24 24 4
gpt4 key购买 nike

我有一个对象数组,我想通过索引删除一个值。我有一个方法,将要删除的值传递给该方法,找到传递的参数值:

remove: (val) ->
for el, index in @arr
if el is val
# remove el from @arr...

CoffeeScript website说得很清楚,为了替换我想要的元素,我必须做 @arr[index] = 'something',但没有说要完全删除它。

最佳答案

只需使用.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 中):

Removing 5 random elements from an array with 10.000.000 integers

cumulative execution time after each removed element

filter method

  • 197ms
  • 422ms
  • 626ms
  • 847ms
  • 1087ms

splice method

  • 33ms
  • 83ms
  • 142ms
  • 198ms
  • 255ms

splice and indexOf method

  • 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/

关于javascript - Coffeescript 按索引删除数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22659060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com