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
迭代器循环。问题是,每次迭代可能会生成多个需要添加到其中的新坐标队列。我明白了。然后,是的,推到一个新的数组是一个明显的解决方案(因为咖啡不允许)。请参阅非明显、深奥、低效的解决方案的编辑。感谢对切片的更正,这是我在别处读到的。