Избегайте вложенных в петли - PullRequest
0 голосов
/ 24 января 2019

У меня проблема с циклами 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' 1 миллион раз, а только 2k раз. Так что результат тот же, но не так часто.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вместо использования вложенных циклов, вы можете использовать Map и взять uuid в качестве средства доступа для нужных данных. Затем проверьте, существует ли и то, и другое, и создайте свою линию.

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);
}
0 голосов
/ 24 января 2019

Добро пожаловать в 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В любом случае, время не очень хорошо для производительности: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...