2015-03-24 3 views
1

Ну, я задал этот вопрос раньше и сделал правильный беспорядок, просто;Double For loop

У меня есть два вложенных для петель:

//example x co-ords 
var v_circle_collection = [550, 450, 350, 450, 1000, 1450, 1900, 2350, 2200, 2200, 2800, 2700, 2600, 2700, 3250, 3050]; 

//example x co-ords of circle collection 
var circleCollection = [450, 900, 1350, 1800, 2250, 2700, 3150]; 

for (var i = 0; i < v_circle_collection.length; i++) { 

    for (var n = 0; n < circleCollection.length; n++) { 

     //i only need to go through CircleCollection 7 times. but this nested for loop does the 16*7 sum. 
     if (v_circle_collection[i] > circleCollection[n]) { 
      //do the stuff i need to do 
     } 
    } 
} 

Первый цикл будет объезжать 7 раз в то время как другая петля развозит 16 раз делая 7 * 16 сум. То, что мне нужно для первого цикла for, - это получить доступ ко всем значениям в circleCollection, поскольку в этом массиве только 7, но из-за следующего цикла, а затем примерно в 16 раз он вмешивается в него.

Мне нужно только пройти через circleCollection 7 раз, есть ли способ, которым я могу это сделать? Является ли использование вложенных для циклов подобным образом неправильным способом?

что мне действительно нужно, это какой-то счет, который будет идти только на 0-6 вместо использования другого цикла.

JS FIDDLE - https://jsfiddle.net/oomw8snq/1/

enter image description here

это цель я пытаюсь получить enter image description here

enter image description here

если я жесткий код он работает, как никогда, потому что может быть произвольное количество созданных кругов не является жизнеспособным:

код: цикл for в действительности не имеет значения, в этом случае ему просто нужно получить доступ к значениям внутри объектов кругов.

for(var i=0; i < v_circle_collection.length; i++) 
{ 
if(v_circle_collection[0].getX() > circleCollection[0].getX()) 
    { 

     v_circle_collection[0].setX(v_circle_collection[0].getX()+5); 
    } 

    if(v_circle_collection[2].getX() < circleCollection[0].getX()) 
    { 

     v_circle_collection[2].setX(v_circle_collection[2].getX()-5); 
    }   


    /*Y's*/ 
    if(v_circle_collection[1].getY() > circleCollection[0].getY()) 
    { 

     v_circle_collection[1].setY(v_circle_collection[1].getY()+4); 
    }   

    if(v_circle_collection[3].getY() < circleCollection[0].getY()) 
    { 

     v_circle_collection[3].setY(v_circle_collection[3].getY()-4); 
    }  

} 
+1

Что objCollection? – slebetman

+0

просто массив элементов окружности SVG, в котором я могу получить значения X и Y. –

+1

каким образом это * мешает * со значениями? Если вы знаете, что это должно быть только цикл через 6 раз, почему вы не можете просто сказать 'for (var i = 0; i <7; i ++) {...}'? –

ответ

1

Я думаю, что вам нужно переключить петлю ..

for(var i =0; i < v_circle_collection.length; i++) 
    { 

      for(var n=0; n < objCollection.length; n++){ 
+0

, который по-прежнему будет делать ту же сумму 16 * 7, по сути, мне нужен счет от 0 до 6 в пределах этого первого цикла в вашем предложении. проблема, с которой я сталкиваюсь, состоит в том, что у circleCollection есть только 0-6 vaules, тогда как soit делает 0 * 16, * 1 * 16, 2 * 16 и т. д. –

+1

Пожалуйста, можете ли вы лучше описать проблему. Я думаю, что я может помочь вам, но теперь я смущен. ok .. позволяет: objCollection.length = 7 v_circle_collection.length = 16; и что с этим делать: small_circle_collection? –

+0

жаль, что это не должно было быть там. Erm .. ну первые петли идут от 0-6 правильно, мне нужно использовать 0,1,2,3,4,5,6 для доступа ко всем vaules в objCollection, так как там есть 7 значений, начиная с @ 0. Однако второй набор объектов окружности v_circle_collection имеет 16 значений, поэтому мне нужен еще один цикл для доступа ко всем из них. так что мне нужен счетчик, начинающийся с 0, считая до 6, вместо того, чтобы первый для цикла, поэтому я могу сделать objCollection [count] или что-то в этом роде. –

1

Вам нужно будет пройти через вложенный цикл, чтобы сделать сравнение вы делаете.

В настоящее время вы зацикливаете 112 раз всего. следующий код заставит вас использовать цикл только тогда, когда в элементе «circleCollection» есть элементы, меньшие, чем текущий элемент «v_circle_collection». T

шляпа должна сделать вас петля 57 раз.

//example x co-ords 
var v_circle_collection = [550, 450, 350, 450, 1000, 1450, 1900, 2350, 2200, 2200, 2800, 2700, 2600, 2700, 3250, 3050]; 

//example x co-ords of circle collection 
var circleCollection = [450, 900, 1350, 1800, 2250, 2700, 3150]; 

function filter(arr, criteria) { 
    return arr.filter(function(obj) { 
     return criteria > obj; 
    }); 
} 

var x = 0; 
for (var i = 0; i < v_circle_collection.length; i++) { 
    var filtred = filter(circleCollection,v_circle_collection[i]); 
    if(filtred.length > 0) { 
     //Found circleCollection that were lower than v_circle_collection do your code here   
    } 

    for (var n = 0; n < filtred.length; n++) { 
     x++; 
     //do the stuff i need to do only on the circleCollection that were smaller than the v_circle_collection 
    } 
} 
alert(x);//total of time i looped (original code was 112) 
+1

он также должен заставлять вас зацикливаться только на элементах меньшего размера. а не весь список –

+1

, чтобы добавить дополнительный уровень сложности. Например, массивы являются базовыми значениями окружности x, чтобы фактически получить это значение, которое нужно выполнить, например circleCollection [i] .getX() и коллекция окружностей, и v_circle_collection оба разных размера. –

0

Вы должны избегать for() петли в линейных массивов:

var v_circle_collection = [550, 450, 350, 450, 1000, 1450, 1900, 2350, 2200, 2200, 2800, 2700, 2600, 2700, 3250, 3050]; 
var circleCollection = [450, 900, 1350, 1800, 2250, 2700, 3150]; 
v_circle_collection.forEach(function(v_c_c){ 
    circleCollection.forEach(function(cc){ 
     if(v_c_c > cc) { 
      ... 
     } 
    }); 
}); 

Если вам нужен svg + data, рассмотрим d3.js библиотека

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