Javascript 如何迭代队列,在执行过程中添加和删除元素?

Javascript 如何迭代队列,在执行过程中添加和删除元素?,javascript,coffeescript,Javascript,Coffeescript,我希望能够遍历队列,每次都向队列添加一些新元素,但删除我处理过的元素 queue = [[0,8],[1,2],[2,4]] for [x,y] in queue for i in [1,2,3] # Do something that results in a new coordinate.. queue.push([newx,newy]) 问题是,我不确定最好的方法是什么 如果我在迭代时从数组中删除每个元素,它会在数组中留下一个空元素 如果复制数组

我希望能够遍历队列,每次都向队列添加一些新元素,但删除我处理过的元素

queue = [[0,8],[1,2],[2,4]]

for [x,y] in queue
    for i in [1,2,3]
        # Do something that results in a new coordinate..
        queue.push([newx,newy])
问题是,我不确定最好的方法是什么

如果我在迭代时从数组中删除每个元素,它会在数组中留下一个空元素

如果复制数组,请通过执行
queue.length=0
将其清空,然后在副本上迭代,这将不起作用,因为当数组包含对象时,执行切片复制不起作用

正确的方法是什么

queue = [[0,8],[1,2],[2,4]]

for [x,y], i in queue
  queue[i] = [x-1,y+1]

console.log queue  #=> [ [ -1, 9 ], [ 0, 3 ], [ 1, 5 ] ]
for
-中的
不适用于更改目标的
.length
的操作,因为它是预先缓存的。要进行内联更新,您必须编写如下代码:

queue = [[0,8],[1,2],[2,4]]

i = -3
while point = queue[i += 3]
  [x,y] = point
  queue[i..i] = ([x-j,y+j] for j in [1,2,3])

console.log queue
#=> [[-1,9],[-2,10],[-3,11],[0,3],[-1,4],[-2,5],[1,5],[0,6],[-1,7]]

您应该做的是修改阵列的副本:

queue2 = queue.slice 0

for [x,y] in queue
  for i in [1,2,3]
    # generate newX and newY
    queue2.push([newx,newy])

queue = queue2
我不知道你说的是什么意思

这是行不通的,因为当数组包含对象时,执行切片复制是行不通的

你可能被你在别处读到的东西误导了。使用
slice
进行阵列复制可以很好地处理对象:

coffee> queue = [[0,8],[1,2],[2,4]]
[ [ 0, 8 ], [ 1, 2 ], [ 2, 4 ] ]
coffee> queue.slice 0
[ [ 0, 8 ], [ 1, 2 ], [ 2, 4 ] ]

它不会做的是对数组存储的对象进行深度复制。但由于您只是对
队列
进行插入和删除,这是完全可以接受的。

首先,不要使用
for…in
循环来迭代数组元素,而是使用普通的
for
循环。第二,我并不完全清楚你想要什么(结果),但也许那只是我,因为我很累。我不明白。。将
用于..有什么不对。。在
中?它允许我为队列中的[x,y]指定要分配给元素的变量名,甚至可以像使用
一样对其进行解压缩。我想要的结果是,在迭代
队列
之后,
队列
只包含我推入的元素,而在迭代开始之前它不包含任何元素:“
for…in
语句除了对数组元素进行迭代外,还对用户定义的属性进行迭代,因此如果修改数组的非整数或非正属性(例如,通过向其添加
“foo”
属性,甚至通过向
数组.prototype添加方法或属性,
),除数值索引外,
for…in
语句还将返回用户定义属性的名称。此外,由于迭代顺序是任意的,因此在数组上迭代可能不会以数值顺序访问元素。”要补充的是:当你迭代旧数组而不删除它的属性时,你不能将元素推到一个新数组吗?啊,有点混乱……这是CoffeeScript:)……它编译的javascript使用一个
for
迭代器循环。问题是,每次迭代可能会生成多个需要添加到其中的新坐标队列。我明白了。然后,是的,推到一个新的数组是一个明显的解决方案(因为咖啡不允许)。请参阅非明显、深奥、低效的解决方案的编辑。感谢对切片的更正,这是我在别处读到的。