避免嵌套循环

时间:2019-01-24 08:12:17

标签: javascript arrays loops

在尝试在数组和对象中查找两个相同值对时,我遇到了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次。因此,结果相同,但不那么频繁。

谢谢!

2 个答案:

答案 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次不利于性能:-)