我在遍历点对象数组,将每个对象与其他对象进行比较并将其推到子数组时遇到问题。主要问题是使用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}
答案 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)
如果目标是在任意两个点之间进行单个比较,即p1
和p2
被认为是无序的,那么组合似乎是有效的,而不是置换。
但是,如果您希望p1
和p2
包含所有可能的排列,而不仅仅是组合,请在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,但是当您有嵌套循环时,有助于澄清代码)