双循环

时间:2015-03-24 18:41:31

标签: javascript html loops svg

我早些时候问了这个问题并简单地把它弄得一团糟;

我有两个嵌套的for循环:

//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个,但由于下一个for循环然后大约16次干扰它。

我只需要经历circleCollection 7次,有没有办法可以做到这一点?使用嵌套for循环就像这样错误的方法吗?

我真正需要的是某种计数,只会转到0-6,而不是使用另一种for循环。

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

enter image description here

这是我正在努力获得的目标 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);
    }    

}

3 个答案:

答案 0 :(得分:1)

我认为你需要切换循环..

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

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

答案 1 :(得分:1)

您需要通过嵌套循环来进行正在进行的比较。

目前你总共循环112次。当&#34; circleCollection&#34;中存在元素时,以下代码将使您循环播放。小于当前&#34; v_circle_collection&#34;元件。 Ť

帽子应该让你循环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)

答案 2 :(得分: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