Javascript 嵌套for循环的迭代问题

Javascript 嵌套for循环的迭代问题,javascript,arrays,for-loop,nested,Javascript,Arrays,For Loop,Nested,我在点对象数组中循环时遇到了一个问题,将每个对象与其他对象进行比较,然后将其推到子数组中。主要问题是使用for循环的迭代。首先,我有一系列要点: var points = [ { id: 1, x: 0.0, y: 0.0 }, { id: 2, x: 10.1, y: -10.1 }, { id: 3, x: -12.2, y: 12.2 }, { id: 4, x: 38.3, y: 38.3 }, { id: 5, x: 79.0, y: 179.0 }

我在点对象数组中循环时遇到了一个问题,将每个对象与其他对象进行比较,然后将其推到子数组中。主要问题是使用for循环的迭代。首先,我有一系列要点:

 var points = [
   { id: 1, x: 0.0, y: 0.0 },
   { id: 2, x: 10.1, y: -10.1 },
   { id: 3, x: -12.2, y: 12.2 },
   { id: 4, x: 38.3, y: 38.3 },
   { id: 5, x: 79.0, y: 179.0 }
 ];
然后,我想将每个点与所有其他点进行比较。显然,我的方法只是比较数组中下一行的i和j。我想要的是每个点对象的子数组,它有对象id,它被比较的点对象的id,以及这两个点之间的距离。Ex输出:[{1,2,12.74423},{1,2,10.76233,{1,3,43.23323},{1,4,23.45645},{1,5127.43432}];这是我的代码,下面是我在控制台中得到的输出。我在这里做错了什么?注意:我放入了一些随机的console.log以查看发生了什么

   var pointPairs = [];
   for (let i = 0; i < points.length; i = i + 1) {
     var p1 = points[i];
     for (let j = i + 1; j < points.length; j = j + 1) {
       var p2 = points[j];
       var distance = Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2);
       pointPairs.push({ p1: p1.id, p2: p2.id, distance });
       console.log(pointPairs);
     };

   };

Pointy在第二个循环中需要从零开始是正确的

如果您只需要遍历列表,我建议避免for循环。与内置的数组迭代方法array.forEach相比,它们冗长且容易出错。这是您的代码,转换为使用array.forEach。我想您会同意,它要简单得多

变量点=[ {id:1,x:0.0,y:0.0}, {id:2,x:10.1,y:-10.1}, {id:3,x:-12.2,y:12.2}, {id:4,x:38.3,y:38.3}, {id:5,x:79.0,y:179.0} ] var pointPairs=[]; points.forEachp1,i=>{ points.forEachp2,j=>{ 变量距离=Math.sqrtp1.x-p2.x**2+p1.y-p2.y**2; push{p1:p1.id,p2:p2.id,distance}; console.logpointPairs; }
} 如果目标是在任意两点之间进行单个比较(即,如果p1和p2被认为是无序的),那么您的算法似乎确实有效,这是一种组合,而不是排列

但是,如果您希望p1和p2包含所有可能的排列,而不仅仅是组合,则从0开始j,并跳过迭代,其中i===j:


innerLoop不是严格需要的,但当您有嵌套循环时,它有助于澄清代码

将j从0开始,就像i一样,并且只在i!==j时添加一个距离。这不是递归的,它只是两个嵌套循环。请添加想要的结果。@gwydion93您能解释一下您发布的原始输出如何不包括每个di之间的距离吗一对点?你能给出一对缺失的点吗?换句话说,我认为这项技术需要一个易于阅读的标签,这意味着这是一种错误的方法。我从未在野外见过标签,这是有充分理由的。是的,我建议一般不要使用嵌套循环,因为它们很快就会混淆。@posit labs给出了一个.IMHO,我认为这个标签在这里很清楚,但其他人可能会对此感到困惑。这个标签是可选的,但对我来说,通过明确指定跳过哪个循环,而不是依赖于隐式地记住它是内部循环,我睡得更好。虽然这不是100%准确,但使用@Pointy的建议和这个的组合,我得到了一个有效的解决方案。基本上,我在运行距离计算并推进到子阵列之前,添加了一个基于I!==j的if语句。
0:{p1: 1, p2: 2, distance: 14.28355697996826}
1:{p1: 1, p2: 3, distance: 17.253405460951758}
2:{p1: 1, p2: 4, distance: 54.16437943888954}
3:{p1: 1, p2: 5, distance: 195.65786465153911}
4:{p1: 2, p2: 3, distance: 31.536962440920014}
5:{p1: 2, p2: 4, distance: 56.01606912306503}
6:{p1: 2, p2: 5, distance: 201.26107422946941}
7:{p1: 3, p2: 4, distance: 56.84593213238745}
8:{p1: 3, p2: 5, distance: 190.10439237429526}
9:{p1: 4, p2: 5, distance: 146.46835835770128}
   var pointPairs = [];
   for (let i = 0; i < points.length; i = i + 1) {
     var p1 = points[i];
     innerLoop: for (let j = 0; j < points.length; j = j + 1) {
       if (j===i) continue innerLoop;
       var p2 = points[j];
       var distance = Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2);
       pointPairs.push({ p1: p1.id, p2: p2.id, distance });
       console.log(pointPairs);
     };

   };