我早些时候问了这个问题并简单地把它弄得一团糟;
我有两个嵌套的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/
这是我正在努力获得的目标
如果我对其进行硬编码,它的工作原理是因为可以创建任意数量的圆圈,这是不可行的:
代码: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);
}
}
答案 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库