簡體   English   中英

嵌套for循環的迭代問題

[英]Iteration issues with nested for loop

我在遍歷點對象數組,將每個對象與其他對象進行比較並將其推到子數組時遇到問題。 主要問題是使用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}

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

如果目標是在任意兩個點之間進行單個比較(例如,如果p1p2被認為是無序的),那么組合似乎是有效的,而不是置換。

但是,如果您希望p1p2包含所有可能的排列,而不僅僅是組合,則從0開始j並跳過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);
     };

   };

(不是必須使用innerLoop 標簽 ,但是當您有嵌套循環時,它有助於澄清代碼)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM