2014-03-25 3 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

Ну, что такое 'points'? Это «живая» коллекция или статическая? Если удаление элементов из коллекции в процессе итерации является проблемой, вы всегда можете сохранить элементы, которые должны быть удалены в коллекции '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

Спасибо за ответ, похоже, хорошая оптимизация, но в моем случае, когда метабаки близки друг к другу (но недостаточно близко для слияния), мне нужно, чтобы они двигались ближе. И с этими циклами, только один из пары переходит к другому. EDIT: nevermind Я устал и на самом деле не думал об этом, он работает, но нужно немного больше кода – davidv

Смежные вопросы