嵌套for循环的迭代问题

时间:2018-06-26 20:06:58

标签: 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 }
 ];

然后,我想将每个点与所有其他点进行比较。显然,我的方法只是比较i与数组中下一行的j。我想要的是每个具有对象ID,与之进行比较的点对象的ID以及这两个点之间的距离的每个点对象的子数组。 Ex输出:[{1, 2, 12.74423}, {1, 2, 10.76233), {1, 3, 43.23323}, {1, 4, 23.45645}, {1, 5, 127.43432}];这是我的代码,下面是我在控制台中得到的输出。我在这里做错了什么?注意:我随机输入了console.logs来看看发生了什么。

   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);
     };

   };

结果:

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}

2 个答案:

答案 0 :(得分:2)

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

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

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 }
]
var pointPairs = [];
points.forEach((p1, i) => {
    points.forEach((p2, 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);
    })
})

答案 1 :(得分:0)

如果目标是在任意两个点之间进行单个比较,即p1p2被认为是无序的,那么组合似乎是有效的,而不是置换。

但是,如果您希望p1p2包含所有可能的排列,而不仅仅是组合,请在j开始0并跳过其中{{1 }}:

i===j

(并非严格要求 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); }; }; label,但是当您有嵌套循环时,有助于澄清代码)