在尝试在数组和对象中查找两个相同值对时,我遇到了in循环问题:
for (features in geodata.features) {
if (geodata.features[features].geometry.type == 'Point') {
.....
} else if (geodata.features[features].geometry.type == 'LineString') {
for (itema in networkElemente) { //Here is the part whrere it gets problematic
for (itemb in networkElemente) {
if (networkElemente[itema].uuid == geodata.features[features].properties.a.ne.uuid && networkElemente[itemb].uuid == geodata.features[features].properties.b.ne.uuid) {
console.log('klappt');
var intraOrtsVerbindung = L.polyline([[networkElemente[Number(itemb)].coords.lat,networkElemente[Number(itemb)].coords.lng],[networkElemente[Number(itema)].coords.lat,networkElemente[Number(itema)].coords.lng]], {
weight: 5,
color: 'green',
opacity: 1,
}).addTo(map);
}
}
}
}
}
我有数组networkElemente
,我有geodata.fea... .a
和.b
。现在我想看看,如果geodata...a
有一个与networkElemente
相同的条目,而... b
也有一个与networkElemente
类似的条目。这些嵌套循环可以很好地工作,这将不必要地执行该部分。我想分开循环,以便如果networkElemente.length
为1000,则它不会记录'klappt'100万次,而仅记录2k次。因此,结果相同,但不那么频繁。
谢谢!
答案 0 :(得分:0)
您可以使用Map
并将uuid
用作所需数据的访问器,而不是使用嵌套循环。然后检查两者是否都存在,并制作您的poyline。
var networkElementeMap = new Map(networkElemente.map(o => [o.uuid, o])),
elementA = networkElementeMap.get(geodata.features[features].properties.a.ne.uuid),
elementB = networkElementeMap.get(geodata.features[features].properties.b.ne.uuid);
if (elementA && elementB) {
console.log('klappt');
var intraOrtsVerbindung = L.polyline([
[elementB.coords.lat, elementB.coords.lng],
[elementA.coords.lat, elementA.coords.lng]
], {
weight: 5,
color: 'green',
opacity: 1,
}).addTo(map);
}
答案 1 :(得分:-1)
欢迎使用StackOverflow
这里的问题是组合器。除了可能在需要for...in
时使用for...of
之外,还有问题。
最简单的优化是永远不要检查同一对。您可以通过使用常规for...loop
并偏移嵌套循环的索引来做到这一点:
var networkElemente = [];
while (networkElemente.length < 1000) {
networkElemente.push(networkElemente.length + 1);
}
var count = 0;
for (var a = 0; a < networkElemente.length; a++) {
var itema = networkElemente[a];
for (var b = a + 1; b < networkElemente.length; b++) {
var itemb = networkElemente[b];
count++;
}
}
console.log("Count: " + count);
对于您经常记录的问题,最简单的解决方案是简单地保存一个计数变量,并在循环完成后记录一次。
记录2K次不利于性能:-)