2012-07-26 77 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); })