2014-03-25 248 views
0

我正在JS中寫一個簡單的元球實現。我有一系列的元球,我遍歷它們的每一幀,併爲每一個我檢查距離每個其他元球,如果他們足夠接近我需要合併它們。刪除嵌套循環中的元素

這是我猜怎麼看,但我不知道如何正確地從數組中刪除元素,而不是打破循環。

for(var i = 0; i < points.length; i++) { 
    for(var j = 0; j < points.length ; j++) { 
     if(i != j) { 
      if(distance < 10) { 
       //remove one of the points using splice 
      } 
     } 
    } 
} 

感謝您的幫助。

+1

那麼,什麼是「點」?它是一個「活的」集合還是靜態的?如果在迭代過程中從集合中刪除項目是一個問題,您可以隨時將要刪除的項目存儲在'toDelete'集合中,然後遍歷它以稍後刪除它們。 –

+1

拼接文檔:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice#Examples –

+0

這是一個很好的機會,這是一個O(n^3)算法,因爲各種刪除功能的時間可能會很糟糕。我說「可能是」,因爲JS數組的內部表示在規範中不明確。 –

回答

0

首先,開始你的內循環i + 1。您已經比較了元素高達i,因此無需重複,對嗎?讓我們來擺脫你的if聲明。

然後,當你拼接,減少j,以便不跳過下一個元素。

for(var i = 0; i < points.length; i++) { 
    for(var j = i + 1; j < points.length ; j++) { 
     if (distance(i, j) < 10) { 
      points.splice(j--, 1); 
     } 
    } 
} 
+0

@ user2715488 - 請注意''splice()'總是返回一個數組。如果你想使用被刪除的元素(正如你需要做合併邏輯所建議的那樣),你可能需要執行'point = points.splice(j--,1)[0];'來獲取它。 –

+0

感謝您的回答,這似乎是一個很好的優化,但在我的情況下,當metaballs彼此接近(但不足以合併)我需要他們靠近。在這些循環中,只有一個移動到另一個。 編輯:沒關係我累了,並沒有真正考慮它,它的工作原理,但需要多一點代碼 – davidv