2012-07-26 74 views
7

我使用Three.JS制作飞机并在其上放置了一些框 我需要有时删除所有框。所以我想用下面的代码来做到这一点:不能使用Three.JS删除对象

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

/这种自相残杀对象不是飞机或它删除一些箱子相机;-)/

,但不所有这些=( 如何删除所有框? 问候,何塞

+0

你不应该调用你的var对象。这是对象的实际定义的保留关键字。 – FlavorScape 2012-07-26 21:46:24

+0

对象应该很好,对象是保留的(大写o) – ama2 2012-07-26 21:53:44

+0

这不是问题... =(。@ ama2是对的 – 2012-07-26 22:17:01

回答

21

当您移除像这样的数组对象时,您需要回到前面,而不是从前到后。

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只会被获取一次,而不是每个循环。

+0

你明白了!谢谢@Crazycatz !!! = D = D = D = D = D = D = D – 2012-07-30 23:20:56

+0

谢谢!:) <3 – 2016-06-15 21:31:13

1

你应该使用!==而不是!=(它快一点)。你是否试图通过你的循环和检查场景儿童在那之后?也许你在飞机上添加了一些盒子,这些盒子不会被删除循环。

+0

好主意。多数民众赞成在没有问题,但无论如何谢谢你的想法先生@塞巴斯蒂安Sachtleben。问候 – 2012-07-30 23:22:10

2

@Crazycatz答案是正确的,当然,但现在我们是在2016年和代替手工迭代,我们可以叫.slice()和遍历数组复制:

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

或不ES6超值服务:

scene.children.slice().forEach(function(obj) { scene.remove(obj); })