7

我正在使用 Three.JS 制作飞机并将一些盒子放在上面我有时需要移除所有盒子。所以我试图用下面的代码来做:

for ( i = 0; i < scene.children.length; i ++ ) {
    var object = scene.children[ i ];
    if ( object != plane && object != camera) {
        scene.remove(object);
    }
}

/这会杀死不是飞机或相机的每个物体;-) /

它删除了一些框,但不是全部=(我怎样才能删除所有框?问候,何塞

4

3 回答 3

22

像这样删除数组对象时,您需要从前到后,而不是从前到后。

var obj, i;
for ( i = scene.children.length - 1; i >= 0 ; i -- ) {
    obj = scene.children[ i ];
    if ( obj !== plane && obj !== camera) {
        scene.remove(obj);
    }
}

正在发生的事情是当一个节点移除一个节点时,它转移后的所有节点。假设您删除了 scene.children[0]:children[1] 将成为新的 0,2 将成为 1,依此类推。当从 0 变为 array.length 时,for 循环已经继续并正在跳过 1 个节点你删除的每一个。

作为一个额外的好处,这应该会稍微快一点,特别是如果你有很多对象,因为 scene.children.length 只得到一次,而不是每个循环。

于 2012-07-28T08:20:11.960 回答
3

@Crazycatz 的答案当然是正确的,但现在我们在 2016 年,我们可以调用.slice()并遍历数组副本,而不是手动迭代:

scene.children.slice().forEach(obj => scene.remove(obj))

或者没有 ES6 好东西:

scene.children.slice().forEach(function(obj) { scene.remove(obj); })
于 2016-11-21T19:30:27.570 回答
2

您应该使用 !== 而不是 != (它有点快)。之后您是否尝试过单步执行循环并检查场景子项?也许您在平面上添加了一些框作为子元素,这些框不会被此循环删除。

于 2012-07-27T11:50:04.930 回答