2

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

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然后遍历副本,那将不起作用,因为当数组包含对象时,执行切片复制不起作用。

这样做的正确方法是什么?

4

2 回答 2

1
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-in不适合更改目标的操作,.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]]
于 2011-05-10T22:12:50.887 回答
1

您应该做的是修改数组的副本:

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

我不确定你说的是什么意思

这不起作用,因为当数组包含对象时,执行切片复制不起作用。

你可能被你在别处读到的东西误导了。使用sliceto 进行数组复制非常适用于对象:

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

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

于 2011-05-10T22:23:02.663 回答